数字中国·星火文集 | 云原生技术范式颠覆——从Spring Cloud到Service Mesh框架重构之路(上篇)
发布时间:2022-06-15

云原生技术范式颠覆

——从Spring Cloud到

Service Mesh框架重构之路

尊龙时凯

徐超

郭总在《数字化的力量》一书提到过:

数字化时代的新技术范式最典型的特征是以云原生为核心,,,,以大数据、、、物联网、、、云计算、、可穿戴设备、、、区块链、、、人工智能等多种数字技术为通用技术。。与一百多年前的电力技术、、、两百多年前的蒸汽机技术一样,,,,这种新技术范式所包含的一系列通用技术正日益渗透到经济、、、、社会和生活的各个角落,,,广泛应用于传统产业的各个领域。。

郭为.数字化的力量[M]. 北京:机械工业出版社,,,,2022.

作为新一代微服务架构体系,,,,Service Mesh技术有效地解决了Spring Cloud微服务架构和服务治理过程中的痛点问题,,,,一经推出便引起了很大的反响。。。。近几年来,,,,伴随着云原生的热火朝天,,Service Mesh被推向了巅峰,,,从陌生走向大家的视界。。。。对于初创企业或全新产品,,,选择 Service Mesh变得相对轻松很多,,,,毕竟不存在迁移的问题。。。。但对于大部分企业或成熟的产品体系,,这样大的架构转型就变得很难以实施,,,需要多加权衡利弊,,,面对Service Mesh带来的好处,,不得不迫使向它靠拢。。

目前很多企业或产品还是采用基于SDK的传统微服务框架(例如,,,,Dubbo、、、、Spring Cloud等)进行服务治理,,,,而随着Service Mesh的普及,,,,越来越多的企业开始布局自己的Service Mesh框架体系,,但多数企业刚开始不会激进地将所有业务迁移至Serivice Mesh,,,毕竟这样风险太大、、、、收益太慢。。。。像Java技术栈应用依然保留原框架,,,,而非Java技术栈应用采用Service Mesh框架,,不同开发语言可以用不同的技术框架,,,但业务不能被框架割裂,,,,那么在这两种架构体系下应用服务如何互联互通????微服务如何统一治理????传统微服务又如何平滑迁移至Service Mesh呢????

如何解决上述问题呢???今天我们就针对构建基于Spring Cloud向Service Mesh框架迁移过程中的诸多问题展开讨论,,,尽可能提供一套完善的解决方案和迁移思路,,,,供大家参考。。。

01.背景

微服务是一个很大的概念,,不同人对它的理解都各不相同,,,,甚至在早期微服务架构中出现了一批四不像的微服务架构产品,,,,有人把单纯引入Spring Boot、、Spring Cloud框架也叫做微服务架构,,,实际上却只是将它作为服务的Web运行环境而已。。。。

微服务纷纷落地,,并投入生产,,,但随着微服务规模的不断壮大,,,每增加一个微服务,,,,就可能会增加一些依赖的基础设施和第三方的配置,,,,比如Kafka实例配置等,,,相应CI/CD的配置也会增加或调整。。。同时随着微服务数量增多、、、、业务复杂性的提升及需求的多样性等(如,,,对接第三方异构系统等),,服务间通信的错综复杂,,,,一步步地将微服务变得更加臃肿,,,,服务治理也是难上加难,,而这些问题在单体架构中却是很容易解决。。。。为此,,,有人开始怀疑当初微服务化是否是明智之选,,甚至考虑回归到传统单体应用。。

正如下图所示,,PPT中的微服务总是美好的,,但现实中的微服务却是一团糟糕,,想甩甩不掉,,越看越糟心。。。。难道就没有办法了么????

1.1

传统微服务架构面临的挑战

面对上述暴露出的问题,,,,并在传统微服务架构下,,经过实践的不断冲击,,面临了更多新的挑战,,,,综上所述,,,,产生这些问题的原因有以下这几点:

● 过于绑定特定技术栈。。当面对异构系统时,,需要花费大量精力来进行代码的改造,,,不同异构系统可能面临不同的改造。。

● 代码侵入度过高。。。。开发者往往需要花费大量的精力来考虑如何与框架或 SDK结合,,并在业务中更好的深度融合,,,,对于大部分开发者而言都是一个高曲线的学习过程。。。。

● 多语言支持受限。。。微服务提倡不同组件可以使用最适合它的语言开发,,,但是在Spring Cloud框架下就是Java的天下,,,多语言的支持难度很大。。。。这也就导致在面对异构系统对接时的无奈,,,,或退而求其次的方案。。。

● 老旧系统维护难。。。面对老旧系统,,,,很难做到统一维护、、治理、、监控等,,在过度时期往往需要多个团队分而管之,,,维护难度加大。。

上述这些问题都是在所难免,,众所周知技术演进来源于实践中不断的摸索,,,将功能抽象、、、解耦、、、、封装、、、服务化。。。随着传统微服务架构暴露出的这些问题,,将迎来新的挑战、、、新的机遇,,让大家纷纷寻找其他解决方案。。。。

1.2

迎来新一代微服务架构

为了解决传统微服务面临的问题,,,,以应对全新的挑战,,,微服务架构也进一步演化,,,最终催生了Service Mesh的出现,,迎来了新一代微服务架构。。。为了更好地理解Service Mesh的概念和存在的意义,,,我们来回顾一下这一演进过程。。

1.2.1 耦合阶段

在微服务架构中,,服务发现、、熔断、、、治理等能力是微服务架构重要的组成部分。。。微服务化之后,,,,服务更加的分散,,,复杂度变得更高,,起初开发者将诸如熔断、、、超时等功能和业务代码封装在一起,,使服务具备了网络控制能力,,,如下图所示:

这种方案虽然易于实现,,,但从设计角度来讲却存在一定的缺陷。。。

● 基础设施功能(如,,,,服务发现,,,,负载均衡、、、、熔断等)和业务逻辑高度耦合。。。

● 每个微服务都重复实现了相同功能的代码。。

● 管理困难。。。。如果某个服务的负载均衡发生变化,,,,则调用它的相关服务都需要更新变化。。。

● 开发者不能集中精力只关注于业务逻辑开发。。。。

1.2.2 公共库SDK

基于上面存在的问题,,,便想到将基础设施功能设计为一个公共库SDK,,,,让服务的业务逻辑与这些功能分离,,,,降低耦合度,,提高重复利用率,,使得开发者只需要关注公共库SDK的依赖及使用,,,不必关注实现这些公共功能,,从而更加专注于业务逻辑的开发,,,,比如Spring Cloud框架是类似的方式。。如下图所示:

实际上即便如此,,它仍然有一些不足之处。。。。

● 这些公共库SDK存在较为陡峭的学习成本,,需要耗费开发人员一定的时间和人力与现有系统集成,,,,甚至需要考虑修改现有代码进行整合。。。

● 这些公共库SDK一般都是通过特定语言实现,,缺乏多语言的支持,,在对现有系统整合时有一定的局限性。。。。

● 公共库SDK的管理和维护依然需要耗费开发者的大量精力,,,并需专门人员来进行管理维护。。。

1.2.3 Sidecar模式

基于公共库SDK的启发,,加上跨语言问题、、更新后的发布和维护等问题,,,,人们发现更好的解决方案是把它作为一个代理,,,,服务通过这个透明的代理完成所有流量的控制。。。。

这就是典型的Sidecar代理模式,,,也被翻译为边车代理,,,它作为与其他服务通信的桥梁,,为服务提供额外的网络特性,,,并与服务独立部署,,对服务零侵入,,,,更不会受限于服务的开发语言和技术栈,,如下图所示:

● 以Sidecar模式进行通信代理,,,实现了基础实施层与业务逻辑的完全隔离,,,在部署、、、、升级时带来了便利,,,,做到了真正的基础设施层与业务逻辑层的彻底解耦。。。。另一方面,,,Sidecar可以更加快速地为应用服务提供更灵活的扩展,,而不需要应用服务的大量改造。。。

于是,,,应用服务终于可以做到跨语言开发、、、并更专注于业务逻辑的开发。。。

1.2.4 Service Mesh

把Sidecar模式充分应用于一个庞大的微服务架构系统,,,为每个应用服务配套部署一个Sidecar代理,,完成服务间复杂的通信,,最终得到一个如下所示的网络拓扑结构,,,这就是Service Mesh,,,又称之为“服务网格”。。。。

至此,,迎来了全新一代微服务架构——Service Mesh,,,,它将彻底解决了传统微服务架构所面临的问题。。。。

1.3

什么是Service Mesh

在开始进入主题之前,,,我认为有必要再对Service Mesh进行统一的阐述,,,,这样将有助于理解它,,,,更加便于阅读接下来的内容。。。

1.3.1 Service Mesh介绍

Service Mesh翻译为“服务网格”,,,作为服务间通信的基础设施层。。轻量级高性能网络代理,,,提供安全的、、、、快速的、、、可靠地服务间通讯,,与实际应用部署一起,,,,但对应用透明。。应用作为服务的发起方,,,,只需要用最简单的方式将请求发送给本地的服务网格代理,,,,然后网格代理会进行后续的操作,,,,如服务发现,,,负载均衡,,最后将请求转发给目标服务。。。。

Service Mesh目的是解决系统架构微服务化后的服务间通信和治理问题。。服务网格由Sidecar节点组成,,,这个模式的精髓在于实现了数据面(业务逻辑)和控制面的解耦。。具体到微服务架构中,,,,即给每一个微服务实例同步部署一个Sidecar。。

在Service Mesh部署网络结构图中,,,绿色方块为应用服务,,蓝色方块为 Sidecar,,,,应用服务之间通过Sidecar进行通信,,,,整个服务通信形成图中的蓝色网络连线,,,,图中所有蓝色部分就形成了Service Mesh。。其具备如下主要特点:

● 应用程序间通讯的中间层。。。。

● 轻量级网络代理。。。。

● 应用程序无感知。。。

● 解耦应用程序的重试/超时、、、监控、、、、追踪和服务发现。。。。

Service Mesh的出现解决了传统微服务框架中的痛点,,,,使得开发人员专注于业务本身,,,,同时,,,将服务通信及相关管控功能从业务中分离到基础设施层。。。。

1.3.2 Service Mesh的功能

Service Mesh作为微服务架构中负责网络通信的基础设施层,,,具备网络处理的大部分功能。。。。下面列举了一些主要功能:

● 动态路由。。。可通过路由规则来动态路由到所请求的服务,,,便于不同环境、、、不同版本等的动态路由调整。。。

● 故障注入。。。通过引入故障来模拟网络传输中的问题(如延迟)来验证系统的健壮性,,方便完成系统的各类故障测试。。。

● 熔断。。通过服务降级来终止潜在的关联性错误。。。

● 安全。。在Service Mesh上实现了安全机制(如TLS),,,并且很容易在基础设施层完成安全机制更新。。

● 多语言支持。。。作为独立运行且对业务透明的Sidecar代理,,Service Mesh很轻松地支持多语言的异构系统。。

● 多协议支持。。同多语言一样,,也支持多协议。。

● 指标和分布式链路追踪。。

概括起来,,,,Service Mesh主要体现在以下4个方面:

● 可见性:运行时指标遥测、、分布式跟踪。。。。

● 可管理性:服务发现、、负载均衡、、、、运行时动态路由等。。。

● 健壮性:超时、、重试、、、、熔断等弹性能力。。

● 安全性:服务间访问控制、、、、TLS加密通信。。

1.3.3 Service Mesh解决什么问题

Service Mesh主要解决用户如下3个维度的痛点需求:

● 完善的微服务基础设施

通过将微服务通信下沉到基础设施层,,,,屏蔽了微服务处理各种通信问题的复杂度,,,形成微服务之间的抽象协议层。。。开发者无需关心通信层的具体实现,,,也无需关注RPC通信(包含服务发现、、、、负载均衡、、、、流量调度、、、流量降级、、、监控统计等)的一切细节,,真正像本地调用一样使用微服务,,通信相关的一起工作直接交给Service Mesh。。。。

● 语言无关的通信和链路治理

功能上,,,,Service Mesh并没有提供任何新的特性和能力,,,Service Mesh提供的所有通信和服务治理能力在Service Mesh之前的技术中均能找到,,比如Spring Cloud就实现了完善的微服务RPC通信和服务治理支持。。

Service Mesh改变的是通信和服务治理能力提供的方式,,,通过将这些能力实现从各语言业务实现中解耦,,下沉到基础设施层面,,以一种更加通用和标准化的方式提供,,,,屏蔽不同语言、、、不同平台的差异性,,,,有利于通信和服务治理能力的迭代和创新,,使得业务实现更加方便。。。

Service Mesh避免了多语言服务治理上的重复建设,,通过Service Mesh语言无关的通信和服务治理能力,,,,助力于多语言技术栈的效率提升。。

● 通信和服务治理的标准化

■ 微服务治理层面,,,Service Mesh是标准化、、、、体系化、、无侵入的分布式治理平台。。。

■ 标准化方面,,,,Sidecar成为所有微服务流量通信的约束标准,,,,同时Service Mesh的数据平台和控制平面也通过标准协议进行交互。。。。

■ 体系化方面,,,从全局考虑,,,提供多维度立体的微服务可观测能力(Metric、、、、Trace、、、Logging),,并提供体系化的服务治理能力,,,如限流、、、熔断、、安全、、灰度等。。。

通过标准化,,,带来一致的服务治理体验,,减少多业务之间由于服务治理标准不一致带来的沟通和转换成本,,,提升全局服务治理的效率。。

1.4

框架迁移迫在眉睫

为了更好的占领市场,,,满足更多业务场景的需求,,,传统微服务架构(如,,基于Spring Cloud框架的微服务架构)面临了众多新的挑战,,而Service Mesh的出现正好解决了这些问题。。。面对新的框架体系,,对于传统微服务架构该如何应对????

对于Spring Cloud框架的微服务向Service Mesh框架迁移必将迫在眉睫,,,是推翻重来,,还是循序迁移????如果迁移,,又该如何????

(上篇完)

站点地图