Do only one thing and do it well. The “one thing” is defined by a “Bounded Context” in Domain-Driven Design (DDD). Own your own data. No shared data stores. Embrace eventual consistency. Don’t read your writes. Publish your own state-changes (minimally) to an event log. Leverage event logging and/or streaming to replicate and denormalize data from other services. The event log must be subscribable to publish events to subscribers. The event log must be durable and must not lose messages for publishing and replay. Examples: Kafka, Confluent.io, Amazon Kinesis. When aggregating microservice calls, use asynchronous, non-blocking I/O. Perform as much as possible asynchronously. Support a registry/discovery mechanism. Examples: Consul, Eureka Support Location Transparency. Support statelessness–no sticky sessions. Support the use of back-pressure (see, Reactive Streams specification) to avoid cascading failures. Examples: RxJava Support the Circuit Breaker pattern to manage faulty service dependencies. Examples: Hystrix, Apache Zest Consider CQRS to scale reads separately from writes.