概述

Service Mesh的概念最早是由Buoyant公司的CEO William Morgan在https://buoyant.io/2017/04/25/whats-a-service-mesh-and-why-do-i-need-one/里提出,
服务网格的定义是:

A service mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application. In practice, the service mesh is typically implemented as an array of lightweight network proxies that are deployed alongside application code, without the application needing to be aware.

服务网格( Service Mesh )是指用于微服务应用的可配置基础架构层( configurable infrastructure layer )。它使每个service实例之间的通信更加流畅、可靠和迅速。服务网格提供了诸如服务发现、负载均衡、加密、身份鉴定、授权、支持熔断器模式( Circuit Breaker Pattern )以及其他一系列功能。
轻量级的网络代理

实现原理

SideCar

在传统的微服务架构下服务调用的原理。你可以看下面这张图,服务消费者这边除了自身的业务逻辑实现外,还需要集成部分服务框架的逻辑,比如服务发现、负载均衡、熔断降级、封装调用等,而服务提供者这边除了实现服务的业务逻辑外,也要集成部分服务框架的逻辑,比如线程池、限流降级、服务注册等。
image.png
而在Service Mesh架构中,服务框架的功能都集中实现在SideCar里,并在每一个服务消费者和服务提供者的本地都部署一个SideCar,服务消费者和服务提供者只管自己的业务实现,服务消费者向本地的SideCar发起请求,本地的SideCar根据请求的路径向注册中心查询,得到服务提供者的可用节点列表后,再根据负载均衡策略选择一个服务提供者节点,并向这个节点上的SideCar转发请求,服务提供者节点上的SideCar完成流量统计、限流等功能后,再把请求转发给本地部署的服务提供者进程,从而完成一次服务请求。整个流程你可以参考下面这张图。
image.png

Control Plane

服务之间的所有流量都可以通过SideCar来转发,这样的话所有的SideCar就组成了一个服务网格,再通过一个统一的地方与各个SideCar交互,就能控制网格中流量的运转了,这个统一的地方就在Sevice Mesh中就被称为Control Plane。如下图所示,Control Plane的主要作用包括以下几个方面:

  • 服务发现。服务提供者会通过SideCar注册到Control Plane的注册中心,这样的话服务消费者把请求发送给SideCar后,SideCar就会查询Control Plane的注册中心来获取服务提供者节点列表。
  • 负载均衡。SideCar从Control Plane获取到服务提供者节点列表信息后,就需要按照一定的负载均衡算法从可用的节点列表中选取一个节点发起调用,可以通过Control Plane动态修改SideCar中的负载均衡配置。
  • 请求路由。SideCar从Control Plane获取的服务提供者节点列表,也可以通过Control Plane来动态改变,比如需要进行A/B测试、灰度发布或者流量切换时,就可以动态地改变请求路由。
  • 故障处理。服务之间的调用如果出现故障,就需要加以控制,通常的手段有超时重试、熔断等,这些都可以在SideCar转发请求时,通过Control Plane动态配置。
  • 安全认证。可以通过Control Plane控制一个服务可以被谁访问,以及访问哪些信息。
  • 监控上报。所有SideCar转发的请求信息,都会发送到Control Plane,再由Control Plane发送给监控系统,比如Prometheus等。
  • 日志记录。所有SideCar转发的日志信息,也会发送到Control Plane,再由Control Plane发送给日志系统,比如Stackdriver等。
  • 配额控制。可以在Control Plane里给服务的每个调用方配置最大调用次数,在SideCar转发请求给某个服务时,会审计调用是否超出服务对应的次数限制。

Service Mesh - 图3