We keep on inventing new technologies and architectural solutions to improvise upon and deliver a better solution to the industry as per changing needs. Microservices is one valuable architectural solution that has been increasingly popular in the last couple of years. The rise of cloud-based solutions delivering and scaling the application from a no user base to millions in quick time keeps on challenging how we build our services in a monolithic architecture. Microservices architecture is a good solution to deliver independently deployable and maintainable services.
What is a Microservice?
Microservices are loosely coupled services, developed Independently, and can be deployed, and maintained independently. Each of these services is based on a modular approach and has a specific responsibility, has its own tech stacks which can be different from other services in line, can communicate with other services through APIs to work in a larger ecosystem. The benefits of using microservices are:
- Independent hence better maintenance: Since the microservices are developed independently and no direct dependency as in the monolithic approach this can be easy to maintain and scale.
- Single responsibility less complexity: Every service is developed for a single responsibility so the business logic looks clean and can be easily maintained.
- Independent tech stacks: Every microservice can have their own tech stack, this gives the flexibility of choosing the best of tech stacks responsible for the specific set of tasks
- Fault tolerance: In case of errors in one service doesn't impact other services not leading to the collapse of the complete system.
- Easy scaling: In case of a particular service needs more platform infrastructure it can do for the particular service than scaling the whole application
- Easy deployment: In DevOps enabled environment every service runs in its own container making it easier to deploy.
Where does this best fit into?
Although microservices are not limited to any specific kind of applications it definitely helps to solve many problems of cloud-based solutions which needs constant maintenance, easy scaling, and multiple tech stacks to solve specific technology for specific problems.
The use of cloud infrastructure and DevOps complements the complete ecosystem making it easy to deploy, maintain, and scale. The scaling could be time-bound or specific service bound can easily be met using the pay-per-use infrastructure environment of cloud systems and could be cost-effective. Consider you are running an e-commerce store and have seasonal sales discounts where the system needs scaling and maybe you have different payment solutions and one of the payment solutions offers heavy discount attracting heavy user traffic. You may need to integrate one specific for a specific deal and you start scratching your head to align the code with your other parts of the application. Microservices are a great solution in these scenarios.
What it needs to develop it?
More than some specific tools or technologies it needs your approach to design an application. How do you decouple your whole application and build it independently still make it a part of larger ecosystem? If you have been designing systems in the monolithic approach you have to come up with a whole new approach but if you have used SOA then you are very close to microservices. The key things to consider designing a microservice architecture:
Business components: You really need to start thinking of decoupling your application modules and making it business-oriented. Every business functions like sales, production, inventory, procurement can work as independent component services and talk to each other via API's.
Decentralisation of business logic: Another thing to note is to build self-reliant services than a centralised approach. The decentralization of services helps to make them independent and takes care of everything on its what that service or the business process needs. However, in most cases, the business processes need a chain of services to run one after the other which means the message of completion of one service needs to be transferred to another and tie into a chain. This needs a special messaging system which is called a message bus. There are prebuild solutions available to support the message bus service, one the widely used is RabbitMQ. The message bus service is responsible for notifying the services but it hasn't itself to do more than that.
API Gateway: If the system has too many services it would be challenging to manage the endpoints and integrate one service into another. It's a better practice to use a gateway service to route the services which work as a proxy to the services and hide the complexity. The clients get a unified base endpoint and the services make it relatively easy to use and gives a feeling of the old REST API they are familiar with.
Deployment: DevOps is an essential tool for microservice deployment. Each microservice runs in a docker container
Running into an isolated and platform-specific environment. When it comes to manage and scale the multiple services running in multiple Docker containers one can use Kubernetes to orchestrate these containers.
Monitoring: Since there are so many services running and communicating with each other there are chances of failure and could break the process. The manage and monitor service you need a monitoring/logging service that can notify the system failures and let the teams act upon quickly.
The ugly part of Microservices:
With the increase in services, the system could become rather complex and not straightforward to manage Testing efforts: with distributed services in place it becomes more complex to test and multiple teams could be working on different services and finding & solving bugs could become more tedious Time efforts: Since the services are written to be self-reliant there could be a possibility of more coding efforts and duplication of tasks...