Much has been written about the definition of microservices. Adrian Cockcroft says that microservices are “loosely coupled service oriented architecture with bounded contexts.” Martin Fowler has written another popular definition of microservices. These definitions, when carefully parsed, make sense and do describe microservices, but aren’t exactly easy to remember or process.
So, I’d like to propose a pragmatic definition of microservices:
Microservices is an architecture for building a continuously available distributed system with a distributed development model.
Why this definition?
- As many have observed, the technical design patterns behind microservices is not new. The industry has been building distributed systems for a long time.
- Likewise, distributed development isn’t new. Linux is the canonical example of globally distributed development.
- What is new (and hard) is applying distributed development to a distributed system.
In a microservices environment, you need to think about network APIs versus local APIs to create strong abstractions between each of your services. Testing changes — you can’t just run an integration test locally on your laptop in a simple way. So fundamentally, the question becomes what new technologies, tools, and approaches are needed to do distributed development of a distributed system?
We’ll be talking about this today at the Microservices Practitioner Summit, and writing more in the near future. Stay tuned!
And for a more in depth understanding of this definition, take a look at Rafael Schloming’s presentation, “The Other Kind of Distributed System.”