When deployed, each service runs in a Docker container, based on a Docker Image custom tailored to the specific service. From an organizational perspective, this simplifies the overall problem of maintaining a robust deployment and secure environment by breaking it into smaller problems.
Each service lives in a semi-isolated container whose boundaries are very clear and comprehensible, and which contains only the system dependencies necessary to accomplish a very specific purpose.
For example, the container that enables customers’ browser experience is dead simple; it is very nearly a straight Alpine Linux server, with a creatively configured static web server. It actually CAN’T do anything else, which from a security and systems management perspective is a very good thing.
Given that our client’s codebase has been separated into containerized services, it is natural to formalize the problem of how to ensure that the different pieces consistently work well together.
For example, the Orders service may experience a much heavier load at certain times of the year, while the need for the User Identity service may remain consistent.
For another example, we may want to ensure that a certain version of the Web (front-end) cannot be seen by consumers without a compatible version of the Carts service being available for Web to talk to.
Our client relies on Kubernetes to address these and many other types of concerns. Kubernetes provides a formal language for defining and enforcing the layout of a production deployment and the relationships between various services instances.
Each time a developer pushes source code to a given service, our client’s continuous integration server publishes a fully deployable image for that service (provided that the build passes all the tests.) This means that there are very few barriers between development and deployment. The normal process of development produces the actual artifact that is deployed.
Nearly all of our client’s infrastructure is hosted on the Google Cloud platform. This ensures easy access to additional scale when necessary and allows our client to effectively serve their customers in various continents (currently North America and Europe) with minimal administrative overhead.
In the end, the benefits of the engagement were ten-fold. Our client got a global wholesale order management portal that is scalable, internationalized, and accessible with a React front-end that works smoothly within their cloud deployment environment for their custom catalogs, account management, order processing, and customer support via API abstraction layer.
Leveraging cloud-native development enhanced the capabilities of their web-centric application; keep them running consistently, across continents, with less pain and less overall expense.