Service Mesh 的主要实现原理
Service Mesh 是一种新型的用于处理服务与服务之间通信的技术,尤其适用于以云原生应用形式部署的服务,能够保证服务与服务之间调用的可靠性。在实际部署时,Service Mesh 通常以轻量级的网络代理方式与应用的代码部署在一起,从而以应用无感知的方式实现服务治理。
1、与传统的微服务架构的本质区别
Service Mesh 以轻量级的网络代理方式与应用的代码部署在一起,用于保证服务与服务之间调用的可靠性,这与传统的微服务架构有着本质区别,具体体现在以下两点。
跨语言服务调用的需要。大多数公司通常都存在多个业务团队,每个团队业务所采用的开发语言一般都不相同。比如移动服务端的业务主要采用的是 PHP 语言开发,API 平台的业务主要采用的是 Java 语言开发,移动服务端调用 API 平台使用的是 HTTP 请求。如果要进行服务化,改成 RPC 调用,就需要一种既支持 PHP 语言又支持 Java 语言的服务化框架。
云原生应用服务治理的需要。现在微服务越来越多开始容器化,并使用类似 Kubernetes 的容器平台对服务进行管理,逐步向云原生应用的方向进化。而传统的服务治理要求在业务代码里集成服务框架的 SDK,这显然与云原生应用的理念相悖,因此迫切需要一种对业务代码无侵入的适合云原生应用的服务治理方式。
2、Service Mesh 实现原理
服务 A 要调用服务 B,经过 Linkerd 来代理转发,服务 A 和服务 B 的业务代码不需要关心服务框架功能的实现。为此 Linkerd 需要具备负载均衡、熔断、超时重试、监控统计及服务路由等功能。这样,对于跨语言服务调用来说,即使服务消费者和服务提供者采用的语言不同,也不需要集成各自语言的 SDK。
可见 Service Mesh 的实现原理有以下两个。
一个是轻量级的网络代理,也被称为 SideCar,它的作用就是转发服务之间的调用。
一个是基于 SideCar 的服务治理,也被称为 Control Plane,它的作用是向 SideCar 发送各种指令,以完成各种服务治理功能。
3、SideCar
在 Service Mesh 架构中,服务框架的功能都集中在 SideCar 中实现,并在每一个服务消费者和服务提供者的本地都部署一个 SideCar,服务消费者和服务提供者只负责自己的业务实现,服务消费者向本地的 SideCar 发起请求,本地的 SideCar 根据请求的路径向注册中心查询,得到服务提供者的可用节点列表后,再根据负载均衡策略选择一个服务提供者节点,并向这个节点上的 SideCar 转发请求,服务提供者节点上的 SideCar 完成流量统计、限流等功能后,再把请求转发给本地部署的服务提供者进程,从而完成一次服务请求。
服务消费者节点上的 SideCar 称为正向代理,服务提供者节点上的 SideCar 称为反向代理,Service Mesh 架构的关键点就在于服务消费者发出的请求如何通过正向代理转发,以及服务提供者收到的请求如何通过反向代理转发。
4、Control Plane
SideCar 能实现服务之间的调用拦截功能,那么服务之间的所有流量都可以通过 SideCar 来转发,这样所有的 SideCar 就组成了一个服务网格,再通过一个统一的地方与各个 SideCar 交互,就能控制网格中流量的运转了,这个统一的地方在 Service 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 转发请求给某个服务时,会审计调用是否超出服务对应的次数限制。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/e13213af7fa45d54458125166】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论