当前位置: 首页 > 科技观察

如果看完这篇文章,你还不明白ServiceMesh?那你就可以彻底放弃微服务了!

时间:2023-03-15 09:51:34 科技观察

ServiceMesh是下一代微服务技术的代名词,却深得人心,大有统一微服务时代的趋势。那么ServiceMesh到底是什么?一句话:ServiceMesh就是微服务时代的TCP协议。有了这样一个感性的初步认识,我们再来看看什么是ServiceMesh。说到ServiceMesh,就不得不提到微服务。根据维基百科的定义:微服务(Microservices)是一种软件架构风格,它以专注于单一职责和功能的小功能块(SmallBuildingBlocks)为基础,采用模块化的方式将复杂的大规模组合在一起在应用程序中,每个功能块使用独立于语言(Language-Independent/Languageagnostic)的API集来相互通信。目前业界与微服务相关的开发平台和框架太多了:SpringCloud、ServiceFabric、Linkerd、Envoy、Istio……这五花八门的产品和ServiceMesh有什么关系?哪些属于ServiceMesh的范畴?为了理清这些复杂的产品和概念,我们先来了解一下微服务和ServiceMesh技术的历史发展。一旦了解了技术的主要脉络,就可以清楚地知道上述平台和框架属于技术脉络中的哪个节点,它们之间的关系也一目了然。PhilCal?ado的文章《Pattern: Service Mesh》从开发者的角度详细介绍了服务开发模型和ServiceMesh技术的演进过程。个人认为是学习ServiceMesh的非常经典的教材。这里我借用文章的脉络,结合自己的理解,进行简化,试图厘清ServiceMesh的概念和这项技术诞生的历史必然性。时代0:在开发者的想象中,不同服务之间通信方式的抽象表示如下:时代1:原始通信时代然而,现实远比想象的复杂。在实际情况下,通信需要能够传输字节码和电子信号的底层物理基础设施。层。在TCP协议出现之前,服务需要处理网络通信面临的丢包、乱序、重试等一系列流控问题。因此,除了业务逻辑,还有网络传输问题解决逻辑。时代2:TCP时代,为了避免每个服务都需要实现一套类似的网络传输处理逻辑,出现了TCP协议,它解决了网络传输中的通用流控问题,将技术栈下移,而从服务的实现开始,它就从网络层抽离出来,成为操作系统网络层的一部分。时代3:第一代微服务出现TCP后,机器之间的网络通信不再是问题,以GFS/BigTable/MapReduce为代表的分布式系统蓬勃发展。这时候分布式系统特有的通信语义又出现了,比如熔断策略、负载均衡、服务发现、认证授权、配额限制、跟踪和监控等,于是服务实现了部分需要的通信语义根据业务要求。时代4:第二代微服务为了避免每个服务都需要实现一套分布式系统通信的语义功能,随着技术的发展,出现了一些微服务架构的开发框架,比如Twitter的Finagle,Facebook的Proxygen以及SpringCloud等。这些框架实现了分布式系统通信所需的各种通用语义功能:如负载均衡、服务发现等,因此一定程度上屏蔽了这些通信细节,让开发者使用更少的框架代码即可开发一个健壮的分布式系统。时代5:第一代ServiceMesh第二代微服务模型看似完美,但开发者很快发现它也存在一些本质问题:第一,虽然框架本身屏蔽了分布式系统通信细节的一些通用功能的实现,但是开发者不得不花更多的精力去掌握和管理复杂的框架本身。在实际应用中,不容易跟踪和解决框架的问题;第二,开发框架通常只支持一种或几种特定的语言,回顾文章开头微服务的定义,一个重要的特点就是语言独立性,但是那些没有框架支持的语言编写的服务很难融入到面向微服务的架构体系中,又想因地制宜地用多种语言实现架构体系中的不同模块也比较困难;第三,框架以lib库的形式与服务挂钩,复杂项目依赖时库版本的兼容性非常困难。同时,框架库的升级也不可能对服务透明,服务会因为升级与业务无关的lib库而被强制升级。因此,以Linkerd、Envoy、Ngixmesh为代表的代理模式(sidecar模式)应运而生。这是第一代ServiceMesh,将分布式服务的通信抽象成一个单一的层,并在这一层实现负载均衡。、服务发现、认证授权、监控跟踪、流量控制等分布式系统所需的功能,作为服务等价的代理服务,随服务一起部署,接管服务的流量,通过通信间接完成代理之间服务之间的通信请求,所以上面提到的三个问题也都解决了。如果我们站在全局的角度来看,会得到如下部署图:如果我们暂时省略服务,只看ServiceMesh的独立组件组成的网络:相信到这里大家已经明白了什么叫ServiceMesh,也就是服务网格起来。它确实看起来像一个错综复杂的服务代理网络。时代6:第二代ServiceMesh第一代ServiceMesh由一系列独立运行的单机代理服务组成。为了提供统一的上层运维入口,进化出了集中控制面板。面板交互更新网络拓扑策略并报告单机数据。这就是以Istio为代表的第二代ServiceMesh。单看单机代理组件(数据面板)和控制面板的ServiceMesh全局部署视图如下:至此,见证了六个时代的变迁,大家一定知道ServiceMesh技术是什么,是如何实现的它一步步发展到今天的样子。表单。现在,让我们回顾一下ServiceMesh一词的发明者BuoyantCEOWilliamMorgan对ServiceMesh的定义:ServiceMesh是处理服务之间通信的基础设施层。云原生应用程序具有复杂的服务拓扑,而服务网格可确保请求可靠地通过这些拓扑。在实际应用中,ServiceMesh通常由一系列轻量级的网络代理组成,它们与应用部署在一起,但对应用透明。在这个定义中,有四个关键词:基础设施层+请求可靠穿梭在这些拓扑结构中:这两个词加起来描述了ServiceMesh的定位和功能,是不是似曾相识?没错,你一定想到了TCP;网络代理:描述了ServiceMesh的实现形式;对应用程序透明:这描述了服务网格的关键特性。正是因为这个特性,ServiceMesh才能解决以SpringCloud为代表的问题。第二代微服务框架面临的三个本质问题。总结起来,ServiceMesh有以下优势:屏蔽了分布式系统通信的复杂性(负载均衡、服务发现、认证授权、监控跟踪、流量控制等),服务只需要关注业务逻辑;真正的语言是无关紧要的,服务可以用任何语言编写,它只需要与ServiceMesh通信即可;对应用程序透明,服务网格组件可以单独升级。当然,ServiceMesh目前也面临着一些挑战:ServiceMesh组件以代理方式计算和转发请求,一定程度上会降低通信系统性能,增加系统资源开销;ServiceMesh组件接管了网络流量,因此服务的整体稳定性依赖于ServiceMesh,同时额外引入大量ServiceMesh服务实例来运维和管理也是一个挑战;历史总是惊人的相似。为了解决端到端的字节码通信问题,TCP协议诞生了,让多机通信变得简单可靠;微服务时代,ServiceMesh应运而生,屏蔽了分布式系统的诸多复杂性,让开发者回归业务,关注真正的价值。