Microservices, a word which is buzzing around information technology space almost everyday. What is this means? How did we get here?
Well to start off we need to go back to good old days to see how enterprise applications were developed. Most of the application developed at that time where Monolithic. Monolithic applications are collection of functionalities grouped together which will eventually be compiled and packaged into one single application. In Java terms a Jar/War/Ear. In a monolithic application if an application had a Web Tier, User Registration and Account Registration functionalities. All these will be packaged and deployed as a single unit. Let's see the pros and cons of this approach.
Pros of Monolithic Applications
- Easy steps to build (can be automated).
- Ease of monitoring.
- Centralized code repository.
- Code is monoglot.
Cons of Monolithic Applications
- As the Application becomes complex and large building can take significantly more time.
- During deployment of newer versions there are down times for the application.
- Less Flexible for change.
- Difficulty in scaling out.
These cons are blockers for High Availability/Low Latency, Rapidly Evolving applications. In order to address these Software Architects tried Modular/Component programming where each functionality is developed as a separate module/component. This in fact managed to reduce the build time drastically. But the applications were still monoliths. Deploying a newer version of a module/component meant that the whole application had to stop and restarted as they are run in one process.
Enter Microservices, According to Martin Fowler microservices means;
The term "Microservice Architecture" has sprung up over the last few years to describe a particular way of designing software applications as suites of independently deployable services. While there is no precise definition of this architectural style, there are certain common characteristics around organization around business capability, automated deployment, intelligence in the endpoints, and decentralized control of languages and data.
His illustrations clearly distinguishes a Monolithic application from a Microservices architecture.
Having a Microservices based architecture means that your applications can;
- Evolve rapidly and independently.
- Deploy and test a service easily.
- Scale out or in for demand.
- Be polyglot (Each Microservice can be developed using separate Programming Language/Database).
- Be developed by Small, Independent, Easy to Manage Teams
Lets have a look at Hypothetical Microservices Application. The company MS have business cases for User Registration and Account Registration. User registration has sub use cases (Persisting User, Sending Email Account Verification, Verifying Email Account) of their own which are complex and time consuming but must be flexible for change. Account Registration means maintaining the financial aspect of the User. Furthermore there is a REST API web tier open to users and partners. The following microservices architecture can be used to implement MS company application.
For implementation we can use Spring Boot as it allows to create both Web Container based as well as Stand Alone Production Ready applications using minimal coding. There are more alternatives if you are not a fan of Spring at https://github.com/mfornos/awesome-microservices
When Rabbit MQ is installed successfully, this microservices based application is ready to run. The applications are so independent there is no order to start the microservices. Just running the Main methods of all three projects would spin up the required service.
When a Create New User request is sent to the Web REST API it is enqueued in ms-user queue which will be dequeued and processed by User Registration microservice, which after finishing processing will enqueue another message in ms-account queue. Those messages will be handled by the Account Registration microservice.
Request to REST API
Message Dequeued from Rabbit MQ queue ms-user
Message Dequeued from Rabbit MQ queue ms-account
All the microservices run on their own process and can be modified, scaled out and/or in transparently. The implementation source code can be found at https://github.com/shazin/ms
- Microservices by Martin Fowler - http://martinfowler.com/articles/microservices.html
- Spring Boot - http://projects.spring.io/spring-boot/
- Rabbit MQ - https://www.rabbitmq.com/