A microservices architecture fosters the building of software applications as a suite of independent, fine-grained, and autonomous services. Therefore, when we build a real-world business use case, the microservices that comprise the application have to communicate with each other. With the proliferation of fine-grained services, integrating microservices and building inter-service communication has become one of the most challenging tasks in the realization of microservices architectures.
To understand the challenges of a microservices architecture, let’s first look at the very near past. In the pre-microservices era of service-oriented architecture (SOA) and web services, we would use a central enterprise service bus (ESB) architecture, where all of the service composition and integrations were implemented.
For example, as shown in Figure 1, all of the services were integrated with an ESB, and selected business functions were exposed to the consumers via an API management layer. The ESB provided all of the capabilities required to integrate disparate APIs, data, and systems.
However, when we move into a microservices architecture, having a monolithic integration layer with a large pile of business logic makes it really hard to achieve the fundamental concepts of microservices, such as being autonomous and oriented toward a narrow set of business capabilities. Therefore, it is not practical to use a central ESB as the integration bus.