Microservice architectures need load balancing between services, not just at the edge.
Service A calls Service B. Service B has instances. Which one handles the call?
Client-side load balancing: Service A knows about all Service B instances and picks one. Libraries like Ribbon implement this.
Service mesh: A sidecar proxy handles load balancing. Envoy proxies run alongside each service. They discover instances, balance load, and handle failures transparently.
Service meshes like Istio and Linkerd manage this complexity at scale.