Refactoring complex legacy monoliths into microservices is on the agenda of many tech companies of today. Once the migration is over, however, one quickly learns that the complexity simply spills over from the "dev" to the "ops" side. Many new infrastructural questions arise. For example, how do we maintain stability in a dynamic ecosystem of microservices? How do we recover from communication failures or identify performance bottlenecks in call graphs?
During the refactoring, it's important for legacy clients that the APIs behave in exactly the same way as before, even exhibiting the same quirks and "features". Later, and especially with continuous deployment practices in place, developers have to be confident that changes in a microservice do not break its consumers.
In the first part of the talk we will discuss the concept of a service mesh, a dedicated infrastructure layer for tackling the inter-service communication. We will analyze existing solutions, such as linkerd and Istio, and cover practical aspects of installing a service mesh on both AWS ECS (with the help of Consul) and Kubernetes.
In the second part we will discuss consumer-driven contract testing. We will go through the process of creating contracts for existing systems but also see how to build new services by starting from a contract definition. And since defining the contracts isn't enough, we will show a way of integrating them in build pipelines.
Prerequisite attendee experience level: beginner