1. 创新中心观点
      数字中国·星火文集 | 云原生技术范式颠覆——从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框架迁移必将迫在眉睫,,,,是推翻重来,,,,还是循序迁移??如果迁移,,又该如何???

      (上篇完)

      站点地图