Microservices and Service Mesh
Microservices architecture structures an application as a collection of small, independently deployable services that each own a single business capability and communicate over APIs. A service mesh is the infrastructure layer that manages how those services find and talk to each other – handling encryption, load balancing, retries, and observability without changing the service code itself. Together, these patterns define how most serious cloud applications are built today.
Microservices with Sidecar Proxy (Service Mesh)
The sidecar pattern keeps cross-cutting concerns (security, observability, traffic control) out of application code.
The microservices decomposition decision is primarily organisational: you split services along team boundaries and data ownership, not just technical function. A contact centre platform might decompose into separate services for call routing, agent assignment, recording, real-time analytics, and customer history – each owned by a different team, each deployable on its own schedule. That independence is the core benefit: a bug in the recording service does not bring down call routing. Kubernetes handles the deployment and scheduling of these services. Istio and Linkerd are the two leading service mesh implementations: both inject a sidecar proxy (Envoy in Istio’s case) alongside each service pod that intercepts all network traffic, enforces mTLS, applies traffic policies, and emits detailed telemetry to platforms like Prometheus and Jaeger.
The real-world experience with microservices has tempered the early hype. Distributed systems are harder to debug than monoliths – a single user request might touch 15 services, and tracing a failure across them requires distributed tracing tooling (Jaeger, Zipkin, or Tempo) and careful correlation ID propagation. Many teams have found that starting with a modular monolith and extracting services only when a specific team or scaling need demands it produces better outcomes than decomposing everything upfront. Service meshes add operational complexity of their own – Istio in particular has a steep learning curve. Lightweight alternatives like Cilium eBPF-based networking are gaining ground because they achieve many of the same traffic management goals with less overhead and no sidecar injection required.
Frequently Asked Questions
How do you decide how small a microservice should be?
A good heuristic is “a service should do one thing well and be owned by one team.” If two services are always deployed together, always fail together, or are always changed together, they should probably be one service. If a service requires coordination with three other teams to make a simple change, it is probably too large.
What problems does a service mesh solve?
A service mesh solves cross-cutting concerns that would otherwise require every service team to implement themselves: mutual TLS for encryption, circuit breakers to prevent cascading failures, traffic shaping for canary deployments, and automatic metrics and trace collection. It moves those concerns out of application code into the infrastructure layer.
Is Istio still the best choice for a service mesh?
Istio remains the most feature-complete option but carries significant operational complexity. Linkerd is a strong alternative with a simpler operational model and better performance for most use cases. Cilium with eBPF is increasingly popular because it achieves traffic management at the kernel level without sidecar proxies, which reduces overhead and simplifies debugging.
What is the difference between microservices and serverless?
Microservices are long-running processes that you deploy and manage as containers, typically on Kubernetes. Serverless functions are stateless, event-driven, and managed entirely by the cloud provider – you do not think about instances or scaling. Many organisations use both: persistent microservices for core business logic and serverless functions for event-driven glue code and background processing.
