Scalable Microservices Architecture in Banking Systems: Using Sidecar and Ambassador Patterns
David Shergilashvili
Head of Software Development Unit at TeraBank | ?? T-Shaped .NET Solution Architecture
Introduction
Microservices architecture is becoming increasingly popular in the banking sector because it provides scalability, flexibility, and resilience to systems. In this article, we will delve into the "Sidecar" and "Ambassador" patterns that facilitate the building of scalable microservices architecture. We will explore both the infrastructure aspects of these patterns and their implementation at the code level using the C# programming language.
Step 1: Decomposing a Monolithic Application into Microservices
Firstly, it is necessary to divide the existing monolithic banking application into small, functionally independent microservices. For example, we can separate the following services:
Each service is developed, scaled, and deployed independently, allowing teams to work efficiently and enhancing the overall flexibility of the system.
Step 2: Implementing the Sidecar Pattern: Infrastructure and Code
The Sidecar pattern involves attaching auxiliary components (sidecars) to the main service to extend its functionality. These components perform horizontal functions such as logging, monitoring, security, and more.
In Kubernetes, Sidecars are defined in the Deployment configuration:
In this example, the Accounts Service is augmented with a logging-sidecar container that uses Fluent Bit to collect logs.
To integrate logging into the service code, we use the Microsoft.Extensions.Logging library:
The logging Sidecar will collect these log entries and send them to a centralized logging system.
Step 3: Implementing the Ambassador Pattern: Infrastructure and Code
The Ambassador pattern introduces a mediator component that receives incoming requests, transforms them, and then forwards them to the appropriate services.
In Kubernetes, an Ambassador can be defined as follows:
领英推荐
The Transactions Service is augmented with an accounts-ambassador that handles service requests to the Accounts Service and forwards them appropriately.
The Ambassador code might look like this:
The Ambassador uses HttpClient to communicate with the Accounts Service via HTTP.
The Transactions Service now communicates with the Ambassador to get or create account information:
With containerization and Ambassadors, inter-service communication becomes more independent and flexible.
Step 4: Integrating and Deploying Microservices
After implementing the Sidecar and Ambassador patterns, all microservices need to be integrated into a unified system and deployed in a cluster:
This configuration deploys the Accounts Microservice with three replicas, a Logging Sidecar, a Kubernetes Service, and an Ingress.
A similar configuration should be implemented for all microservices. Additionally, it is essential to establish a CI/CD process to ensure automatic integration and deployment of changes.
Conclusion
Sidecar and Ambassador patterns are powerful tools for building scalable and flexible microservices architecture in banking systems. They help add horizontal functions (logging, monitoring) and abstract inter-service communication.
Using the Kubernetes platform and the C# programming language, it is possible to implement these patterns both infrastructurally and in code. With proper configurations and structured code, we achieve a scalable, resilient, and efficient microservices architecture.