服务网格介绍
在上一节《迎接新一代微服务架构》中,我们知道服务网格经历了 4 个重要阶段:
- 耦合阶段:高度耦合、重复实现、维护困难,在耦合架构设计中体现的最为突出,单体架构就是典型的代表。
- 公共 SDK:让基础设施功能设计成为公共 SDK,提高利用率,是解藕最有效的途径,比如 Spring Cloud 就是类似的方式。但学习成本高、特定语言实现,却将一部分人拦在了门外。
- Sidecar 模式:再次深度解藕,不单单功能解藕,更从跨语言、更新发布和运维等方面入手,实现对业务服务的零侵入,更解藕于开发语言和单一技术栈,实现了完全隔离,为部署、升级带来了便利,做到了真正的基础设施层与业务逻辑层的彻底解耦。另一方面,Sidecar 可以更加快速地为应用服务提供更灵活的扩展,而不需要应用服务的大量改造。
- Service Mesh:把 Sidecar 模式充分应用到一个庞大的微服务架构系统中来,为每个应用服务配套部署一个 Sidecar 代理,完成服务间复杂的通信,最终就会得到一个的网络拓扑结构,这就是服务网格,又称之为“Service Mesh“。它从本质上解决了传统微服务所面临的问题。
接下来,让我们一起全面、真正的开始了解服务网格吧!
1、云原生定义
在正式开始服务网格了解之前,我们先来看看另外一个与之相关的名词——“云原生”,因为在服务网格的技术圈子里,与之密不可分。
CNCF(Cloud Native Computing Foundation(云原生计算基金会))对云原生的定义:
云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。
从上图可知,服务网格是云原生体系的具体实现,是承载微服务架构理念的云原生技术形态。
- 微服务源自服务化架构设计理念,与敏捷开发 DevOps 理念的结合:微、小、快、独。
- 经过四代的技术演进,随着云计算发展到云原生阶段,服务网格则成为承载微服务理念的新一代技术形态。
当你开启服务网格的学习之路后,也就意味着已经踏入了云原生的领域。在这里,服务治理与业务逻辑逐步解耦,服务治理能力下沉到基础设施,服务网格以基础设施的方式提供无侵入的连接控制、安全、可监测性、灰度发布等治理能力,如华为云的 ASM、蚂蚁金服的 SOFAMesh 等,都是对服务网格的最佳实践。
2、服务网格定义
服务网格,又称之为 Service Mesh,作为服务间通信的基础设施层。轻量级高性能网络代理,提供安全的、快速的、可靠地服务间通讯,与实际应用部署一起,但对应用透明。应用作为服务的发起方,只需要用最简单的方式将请求发送给本地的服务网格代理,然后网格代理会进行后续的操作,如服务发现,负载均衡,最后将请求转发给目标服务。
服务网格目的是解决系统架构微服务化后的服务间通信和治理问题。服务网格由 Sidecar 节点组成,这个模式的精髓在于实现了数据面(业务逻辑)和控制面的解耦。具体到微服务架构中,即给每一个微服务实例同步部署一个 Sidecar。
在服务网格部署网络结构图中,绿色方块为应用服务,蓝色方块为 Sidecar,应用服务之间通过 Sidecar 进行通信,整个服务通信形成图中的蓝色网络连线,图中所有蓝色部分就形成了。其具备如下主要特点:
- 应用程序间通讯的中间层
- 轻量级网络代理
- 应用程序无感知
- 解耦应用程序的重试/超时、监控、追踪和服务发现
服务网格的出现解决了传统微服务框架中的痛点,使得开发人员专注于业务本身,同时,将服务通信及相关管控功能从业务中分离到基础设施层。
从云原生的视角来看,服务网格是一种云原生的、应用层的网络技术,具体体现如下:
- 云原生:面向弹性、(微)服务化、去中心化业务场景。
- 应用层:以应用为中心,关注应用的发布、监控、恢复等。
- 网络:关注应用组件之间的接口、流量、数据、访问安全等。
3、服务网格的功能
服务网格作为微服务架构中负责网络通信的基础设施层,具备网络处理的大部分功能。下面列举了一些主要的功能:
- 动态路由。 可通过路由规则来动态路由到所请求的服务,便于不同环境、不同版本等的动态路由调整。
- 故障注入。 通过引入故障来模拟网络传输中的问题(如延迟)来验证系统的健壮性,方便完成系统的各类故障测试。
- 熔断。 通过服务降级来终止潜在的关联性错误。
- 安全。 在服务网格上实现安全机制(如 TLS),并且很容易在基础设施层完成安全机制更新。
- 多语言支持。 作为独立运行且对业务透明的 Sideca 代理,很轻松地支持多语言的异构系统。
- 多协议支持。 同多语言一样,也支持多协议。
- 指标和分布式链路追踪。
概括起来,服务网格主要体现在以下 4 个方面:
- 可见性: 运行时指标遥测、分布式跟踪。
- 可管理性: 服务发现、负载均衡、运行时动态路由等。
- 健壮性: 超时、重试、熔断等弹性能力。
- 安全性: 服务间访问控制、TLS 加密通信。
4、服务网格解决的问题
从上述服务网格的定义看:
- 基础设施层是服务网格的定位,致力于解决微服务基础设施标准化、配置化、服务化和产品化的问题。
- 服务间通信是服务网格技术层面对的问题,对微服务屏蔽通信的复杂度,解决微服务的通信治理问题。
- 请求可靠传递是服务网格的目标。
- 轻量级网络代理是服务网格的部署方式。
- 对应用程序透明是服务网格的亮点和特色,实现对业务无侵入。
综合上述,服务网格主要解决用户如下 3 个维度的痛点需求:
完善的微服务基础设施
通过将微服务通信下沉到基础设施层,屏蔽了微服务处理各种通信问题的复杂度,形成微服务之间的抽象协议层。开发者无需关心通信层的具体实现,也无需关注 RPC 通信(包含服务发现、负载均衡、流量调度、流量降级、监控统计等)的一切细节,真正像本地调用一样使用微服务,通信相关的一起工作直接交给服务网格。
语言无关的通信和链路治理
功能上,服务网格并没有提供任何新的特性和能力,服务网格提供的所有通信和服务治理能力在服务网格之前的技术中均能找到,比如 Spring Cloud 就实现了完善的微服务 RPC 通信和服务治理支持。
服务网格改变的是通信和服务治理能力提供的方式,通过将这些能力实现从各语言业务实现中解耦,下沉到基础设施层面,以一种更加通用和标准化的方式提供,屏蔽不同语言、不同平台的差异性,有利于通信和服务治理能力的迭代和创新,使得业务实现更加方便。
服务网格避免了多语言服务治理上的重复建设,通过服务网格语言无关的通信和服务治理能力,助力于多语言技术栈的效率提升。
通信和服务治理的标准化
- 微服务治理层面,服务网格是标准化、体系化、无侵入的分布式治理平台。
- 标准化方面,Sidecar 成为所有微服务流量通信的约束标准,同时服务网格的数据平台和控制平面也通过标准协议进行交互。
- 体系化方面,从全局考虑,提供多维度立体的微服务可观测能力(Metric、Trace、Logging),并提供体系化的服务治理能力,如限流、熔断、安全、灰度等。
通过标准化,带来一致的服务治理体验,减少多业务之间由于服务治理标准不一致带来的沟通和转换成本,提升全局服务治理的效率。
5、服务网格的原理
服务网格的核心是数据平面(Sidecar)与控制平面(Control Plane),如下图:
数据平面: Sidecar,与服务部署在一起的轻量级网络代理,用于实现服务框架的各项功能(如,服务发现、负载均衡、限流熔断等),让服务回归业务本质。
数据平台可以认为是将 Spring Cloud、Dubbo 等相关的微服务框架中通信和服务治理能力独立出来的一个语言无法的进程,并且更注重通用性和扩展性。在 服务网格 中,不再将数据平面代理视为一个个独立的组件,而是将这些代理连接在一起形成一个全局的分布式网格。
在传统的微服务架构中,各种服务框架的功能(如,服务发现、负载均衡、限流熔断等)代码逻辑或多或少的都需要耦合到服务实例的代码中,给服务实例增加了很多无关业务的代码,同时带来了一定的复杂度。
有了 Sidecar 之后,服务节点只做业务逻辑自身的功能,服务之间的调用只需交给 Sidecar,由 Sidecar 完成注册服务、服务发现、请求路由、熔断限流、日志统计等业务无关功能。
在这种新的微服务架构中,所有的 Sidecar 组成在一起,就形成了服务网格。那么这个大型的服务网格并不是完全自治的,它还需要一个统一的控制节点 Control Plane。
控制平面: 是用来从全局的角度上控制 Sidecar,相当于服务网格整体的大脑,控制着 Sidecar 来实现服务治理的各项功能。比如,它负责所有 Sidecar 的注册,存储统一的路由表,帮助各个 Sidecar 进行负载均衡和请求调度;它收集所有 Sidecar 的监控信息和日志数据。
6、总结
至此,关于服务网格的介绍就到此结束,更深入的理解可结合后续具体应用、实践来加深吧。
参考资料: