Web 应用通信的演进-从 TCP 到 Service Mesh

1. Web 应用通信演进

要想理解 Service Mesh 到底是什么,那就有必要梳理一下在网络应用通信演进的历史,读者如有兴趣可以直接阅读 Pattern: Service Mesh,本节依据这篇文章梳理而来

1.1 TCP 时代的到来

在 TCP 协议出现之前,应用需要自己处理网络通信所面临的丢包、乱序、重试等流控问题,因此在应用中除了业务逻辑外,还夹杂着对网络传输问题的处理逻辑,如下图所示

在这里插入图片描述

TCP 协议出现后解决了网络传输中通用的流量控制问题,这部分逻辑得以从应用中抽离出来,下移成为操作系统网络层的一部分

在这里插入图片描述

1.2 微服务时代的演进

TCP 出现之后机器之间的网络通信不再是问题,分布式系统得以长足发展,微服务架构成为主流。在微服务架构下,单个应用可能由多个服务组成,而每个服务可能又包含多个实例。这样分布式系统特需要解决的新的通信问题出现了,如负载均衡、服务发现等,服务需要根据业务需求自行实现一部分所需功能,于是有了以下结构:

在这里插入图片描述

随着技术的发展,为避免每个服务都重复实现分布式系统通信的功能,一些面向微服务架构的开发框架出现了,如 Spring Cloud 。这些框架实现了分布式系统通信所需要的各种通用功能,并以软件包或者库的形式集成在服务中,一定程度上屏蔽了分布式系统通信细节,减轻了开发人员的负担

在这里插入图片描述

1.3 Service Mesh 时代

以上微服务治理结构已经很完善了,但人们很快又发现它也存在一些问题:

  1. 框架本身的维护管理问题
    因为框架屏蔽了分布式系统通信的一些通用功能实现细节,这就意味着一旦框架本身出现问题,开发者要花更多精力去追踪和解决问题,而这和业务逻辑几乎是完全无关的
  2. 语言无关性问题
    开发框架通常只支持特定的几种语言,那些没有框架支持的语言编写的服务很难融入微服务的架构体系,采用多种语言实现体系中的不同模块也很难做到
  3. 版本兼容问题
    框架以 lib 库的形式集成在服务中,复杂项目依赖时的库版本兼容问题非常棘手,与此同时,服务也会因为和业务无关的 lib 库升级而被迫升级

为了解决以上问题,一个基于代理模式,将分布式服务的通信抽象为单独一层的治理结构出现了,这就是 Service Mesh。Service Mesh 抽象出的代理结构被称为 Sidecar,它在 Sidecar 中实现负载均衡、服务发现、监控追踪等分布式系统所需要的功能,并将其作为一个独立的代理服务与服务部署在一起,接管服务的流量,通过代理之间的通信间接完成服务之间的通信。这样通过集中式的控制平面提供统一的上层运维入口也成为了可能,所有的单机代理组件与控制平面交互就可以进行网络拓扑策略的更新和单机数据的汇报

在这里插入图片描述
只看单机代理组件和控制面板的 Service Mesh 全局部署视图如下,它看起来就像是一个由服务代理所组成的复杂网格
在这里插入图片描述

2. Service Mesh

经过以上对服务间通信实现的追溯,相信读者对Service Mesh已经有了比较直观的印象。简单来说,Service Mesh(服务网格)是微服务架构下的服务治理方案,属于处理服务间通信的基础设施层,本质上是将服务间的通信从无法监控的底层分离出来,达成对通信本身进行控制管理的目标

2.1 Service Mesh 的特点

从功能定位及实现形态上看, Service Mesh 主要有以下几个特点:

  1. 轻量级网络代理
    这是 Service Mesh 作为服务间通信中间件层的实现形态,Sidecar 在原有的客户端和服务端之间作为代理存在,所有出入服务的流量都要先经过该服务的 Sidecar
  2. 对业务服务透明
    这是 Service Mesh 的关键特点,对服务透明实现了业务服务与通信需求的解耦,一方面使业务服务不必关心与其他服务的通信细节,另一方面也使服务间通信中间件的升级迭代不会影响到业务服务
  3. 服务间通信的监控管理
    这是 Service Mesh 主要的功能特点,通过 Sidecar 使链路追踪等功能实现更为优雅,同时也为功能的扩展增加提供了更强的弹性

2.2 Service Mesh 的实现

目前最为知名的两个 Service Mesh 项目是 IstioConduit,其中 Istio 1.4版本以前的架构如下图所示,点击查看最新的架构图,读者如有兴趣可以自行前往 Service Mesh 社区 查看相关文档

在这里插入图片描述

以上架构中主要包含了以下组件,Istio 1.5版本后控制平面内组件整合重建为 istiod,并且废除了 Mixer 组件

  1. Envoy
    Envoy 是服务的代理,也就是 Service Mesh 中 Sidecar 的实现实例,它是 Istio 的数据平面
  2. Pilot
    Pilot 是 Istio 的控制平面的核心,主要为 Envoy sidecar 提供服务发现、用于智能路由的流量管理功能(例如 A/B 测试等)以及弹性功能(超时、重试、熔断器等)。Pilot 将控制流量行为的高级路由规则转换为特定于环境的配置,并在运行时将它们传播到 sidecar
  3. Mixer
    Mixer 属于决策模块,Envoy 在处理请求时调用 Mixer 帮助决策最终能否请求服务实例,可供用户去定制服务权限控制、服务Quota限流、调用统计信息上报及采集分析的能力

基于以上架构,在 Service Mesh 中一个请求的路由过程如下:

  1. 服务A 对 服务B 发起 REST 服务调用
  2. A 节点的流量接管能力将该请求接管到本节点的 Envoy 进程
  3. Envoy 进程通过 Pilot 下发的配置信息经过一系列的负载均衡计算及权限检查,确定了目标 服务B 的实例节点,将请求信息投递给该节点
  4. B 节点收到消息后,流量接管能力将消息接管进 Envoy
  5. Envoy 请求 Mixer,检查Quota限流策略检查是否已经达到上限,检查通过后,则根据 Pilot 下发的内部路由规则,路由给节点内的 服务B 实例
  6. 服务实例收到请求后,进行业务逻辑的处理

2.3 总结

总结起来,Service Mesh 可以比作是微服务架构下的 TCP 协议,是负责服务之间通信控制的基础设施,其具有如下优点:

  1. 降低系统复杂性
    Service Mesh 屏蔽了分布式系统通信的复杂性(负载均衡、服务发现、监控追踪等),使服务只需要关注业务逻辑
  2. 语言无关
    服务可以用任何语言编写,只要可以和 Service Mesh 通信即可
  3. 业务解耦
    Service Mesh 组件可以单独升级,不会在代码层面影响到业务服务

不过 Service Mesh 目前也存在一定的问题:

  1. 性能问题
    Service Mesh 组件以代理模式计算并转发请求,一定程度上会降低通信系统性能,并增加系统资源开销
  2. 稳定性问题
    Service Mesh 组件接管了网络流量,因此服务的整体稳定性依赖于Service Mesh,同时额外引入的大量 Service Mesh 服务实例对运维管理是一个挑战

猜你喜欢

转载自blog.csdn.net/weixin_45505313/article/details/107877354