A year ago, we were in the process of evaluating next-gen architecture for Equinix Cloud Exchange (ECX) portal and APIs, to accommodate growing needs of the platform.
Current monolithic application was developed using Groovy and was packaged as WAR files and deployed on Tomcat application server. Successful applications have the inherent habit of growing over time and would surface as a monster monolithic application, the result of which is an extremely complex application. This leads to difficulty in responding to business needs in adding new features. It’s simply too large for any single developer to fully understand.
Microservice architecture to the rescue!
This blog gives you an overview of how we transformed/migrated from monolithic to Microservice-based architecture.
Welcome to Microservice
Microservices are discrete services that “do one thing and do it well.” They are independently developed, versioned and deployed and retired with little or no impact on other services or dependent applications. Traditional multi-tier architectures group services by functionality. Microservice architecture, by contrast, groups services according to the products and services offered by the organization.
While adapting Microservice architecture, it should be ensured that the below business and architecture challenges are addressed.
We chose domain-driven design or API-contract-first approach for defining a contract for each Microservice. First, we designed our API endpoints behavior by describing them in common ubiquitous language that stakeholders of the project can understand.
Key Architecture Decision:
Domain-Driven Design (DDD)
Domain-Driven Design helps the team create a common model, between the business and IT stakeholders that the team can use to communicate about the business requirements, data entities and process models. The model is modular, extensible and easy to maintain as the design reflects the business model.
Choosing the Right Technology:
The next big challenge was to select the right technology to implement Microservice-based architecture. NodeJS was selected for the Microservice-based architecture development after considering various options.
Node.JS is an extremely lightweight open-source platform that’s driven by a passionate community. It is rich with ever-expanding modules contributed by enthusiasts and has a vibrant online community. This modular system is what allows us to build loosely coupled and scalable systems that talk over HTTP and JSON, since these are built right into Node.js. So this modular architecture goes nicely hand in hand with Microservice.
After selecting Node.JS as a platform, we started exploring existing framework which provides end-to-end lightweight software infrastructure, so that the team can focus only on business logic for Microservice-based development. Most of the framework available in the Node.JS ecosystem is designed for monolithic application / API development. We needed a consistent architecture for all the Microservices to help the team to be productive quickly. We also needed a framework which enforces API contract first and Test Driven Development (TDD) for Microservices development.
We ran into another major problem of managing microservices. Well, containers came to our rescue.
Docker containers enabled us to build ship and run each Microservice in different containers. It is easy to configure and provisioning the microservices stack in any environment is one click away. Tools like Kubernetes can be used to manage this.
However, our experience with the integration or orchestration of different Microservices is that it is considerably complex, not only in terms of custom mediation logic, which must be as complex as the end customer API contract demands with respect to a given channel, but also at the level of transactional control and correlation, even parallelism and performance. If the right set of tools is not given in the microservices world, developers will look elsewhere.
We have developed AquaJS to tackle the above challenges. More in the next blog. Stay tuned.