There are 4 basic guiding principles when developing a system with a service oriented architecture. They are:
1. Service boundaries are explicit
2. Services are autonomous
3. Clients & services share schema and contracts
4. Service compatibility is determined by policy
Service Boundaries are Explicit
When we say a service boundary is explicit, we mean a consumer cannot call methods that are not exposed by a service nor can modify data private to the service. The operations that the consumers can perform are limited to those that are exposed by the service.
Services are Autonomous
Services have to be independent entities. You can deploy a new version of a service without any of its consumers being aware of the change. The service should not depend on the consumer to perform any operation, such as validation of data - this has to be performed by the service itself.
Consumers and Service Share Schema and Contracts
The only way for a consumer to communicate with a service should be through the defined interface. The service shouldn't enable the consumer to perform anything other than the operations defined in the contract. If your service and consumer share a class instead of an interface, then you know you aren't implementing an SOA correctly.
Service Compatibility is Determined By Policy
Just as a schema defines the structure of the data and the contract defines the operations that can be performed, a policy determines how the communication occurs between the consumer and the service. A policy can determine the data representation (encoding), security and reliability features for the consumer-service interaction.
The 4 tenets of service orientation provides a basic definition that is applicable to all implementations of a service oriented architecture.