【进阶之路】服务网格Service Mesh到底是什么

首先,看到Service Mesh这个词,相信很多同学都听说过这个词,但是具体它是干什么的,每个人就各有各的理解了。我第一次系统地了解Service Mesh的时候,也是通过帮同事买课返现,意外地看到这个名词,旺盛的好奇心迫使我点了进去。然后,不多时,我便一头雾水的走了出来。啊这,里面的弯弯绕绕比盥洗室之主还复杂啊!于是乎,在经过一段时间的学习,对Service Mesh有所了解之后,我决定写下这篇文章与大家分享我的理解。

一、什么是Service Mesh

开门见山,先站在前辈的肩膀上给出定义:

Service Mesh这个词的发明人,Buoyant的CEO William Morgan 如此解释:服务网格是一个基础设施层,用于处理服务间通信云原生应用有着复杂的服务拓扑,服务网格保证请求在这些拓扑中可靠地穿梭。在实际应用当中,服务网格通常是由一系列轻量级的网络代理组成的,它们与应用程序部署在一起,但对应用程序透明

Service Mesh,中文名叫作服务网格,用于处理服务间通信的基础设施层,通常是一组与应用一起部署,但对应用透明的轻量级网络代理。简单来说就是将可以配置的代理层和服务部署在一起,作为微服务基础设施层接管服务间的流量,并提供通用的服务注册发现、负载均衡、身份验证、精准路由、服务鉴权等基础功能

Service Mesh与传统基础设施层不同之处在于,它形成了一个分布式的互连代理网络,以sidecar形式部署在服务两侧,服务对于代理无感知,且服务间所有通信都由代理进行路由。它最重要的变革,就是引入了数据面控制面的概念,通过sidecar模式(原意是摩托车的边车,用到软件架构中,就是Sidecar应用是连接到父应用,并为其扩展或增强功能)将原本在SDK中的代码独立出来,用控制面代替配置中心的部分功能,以透明代理的形式提供安全、快速、可靠的服务间通信,同时也能实现微服务所需的基本组件功能。

实际上,Service Mesh 需要的基础组件和传统的微服务并没有太大的差别,很多公司选择自研控制面的原因,很多就是出于兼容老的微服务的基础组件的考虑

好的,我们总结一下之前的发言,Service Mesh到底是做什么的:

  • 1、一个用于处理服务和服务之间通信的基础设施层。
  • 2、实现服务间请求的可靠传递、轻量级的网络代理。
  • 3、对应用与开发者透明,引入了数据面与控制面。
数据面:代理了服务的所有通信。
控制面:运行期间的服务控制,如流量控制和配置管理等。

二、Service Mesh 的演进历程

1、sidecar时代

Netflix是最早采用微服务的公司之一。 为了跟上其增长速度,Netflix决定从庞大而单一的数据中心转向基于云的微服务架构,以实现高可用,大规模和速度。基于其成功案例,Netflix开源了许多工具/技术,为微服务架构提供支持。这个时候 Netflix发现开发多语言的SDK要耗费大量的人力,毕竟在Spring Cloud中的组件可不是一般的多,为每个语言开发一套,显然所需花费的人力物力太大。于是乎,就想到了使用sidecar模式,把SDK里的功能转移到sidecar中。

所谓sidecar,其实就是一个部署在本地的代理服务器,它既接管了入口流量,也接管了出口流量。把所有的sidecar组合到一起,就成了服务网格(Service Mesh)。

2、初代 Service Mesh

在sidecar模式中,更多的是为了解决公司非主力语言的SDK开发问题,采取Adapter模式,非主力语言通过sidecar连接,而主力语言还是正常使用SDK的方式。

虽然sidecar能够解决一些微服务时代的SDK问题,但许多一直存在于微服务架构中的问题却没有办法处理。

  • 1、缺乏统一的管控手段。比如 sidecar 的服务治理相关配置文件的维护,可能需要运维手动维护、无法集中管理,因为这个原因,控制面诞生了。
  • 2、虽然框架本身屏蔽了分布式系统通信的一些通用功能实现细节,但开发者却要花更多精力去掌握和管理复杂的框架本身,在实际应用中,去追踪和解决框架出现的问题也绝非易事(追踪服务本身的问题倒还可以引入链路追踪之类的方法)。
  • 3、框架以lib库的形式和服务联编,复杂项目依赖时的库版本兼容问题非常棘手,同时,框架库的升级也无法对服务透明,服务会因为和业务无关的lib库升级而被迫升级

随着技术不断发展,大家慢慢意识到统一流量处理模型的重要性,于是诞生了第一代Service Mesh,其中比较出名的是Linkerd和Envoy。在这一代Service Mesh中,它将分布式服务的通信抽象为单独一层,在这一层中实现负载均衡、服务发现、认证授权、监控追踪、流量控制等分布式系统所需要的功能,作为一个和服务对等的代理服务,和服务部署在一起,接管服务的流量,通过代理之间的通信间接完成服务之间的通信请求。这样之前所说的sidercar未能解决的问题也得到了解决。

3、第二代 Service Mesh

由于第一代Service Mesh由一系列独立运行的单机代理服务构成,为了降低开发运维人员的维护成本,提供统一的上层运维入口,演化出了集中式的控制面板,所有的单机代理组件通过和控制面板交互进行网络拓扑策略的更新和单机数据的汇报。新一代Service Mesh,比如大家熟知的Istio了。它引入了控制面的概念,让Service Mesh成为完全体,如下图所示:

Istio使用Envoy作为数据面,控制面和Kubernetes 深度绑定,早期版本将流量治理的功能放在 mixer 中,形成了一套完整的 Service Mesh 解决方案。控制面负责了资源管理、配置下发、证书管理等功能,解决了数据面配置难以管理的问题。

至此,我们也大体地对Service Mesh有了初步的印象,接下来,咱一起分析分析,Service Mesh到底解决了传统微服务架构中的哪些痛点吧!

三、Service Mesh的优势

1、语言无关

早在sidecar时代,Netflix将SDK的功能集成到sidecar中就体现了Service Mesh的优势。虽然我们在微服务架构也经常提到这个优点,但是对于传统的微服务架构而言,Service Mesh 做到了真正的语言无关:传统的微服务架构要为各种语言开发SDK,而Service Mesh将SDK的功能集成到sidecar中,实现了真正的语言无关性。

2、只关注业务逻辑

Service Mesh与传统微服务相比,屏蔽了分布式系统通信的复杂性,将可以配置的代理层和服务部署在一起,作为微服务基础设施层接管服务间的流量,并提供通用的服务注册发现、负载均衡、身份验证、精准路由、服务鉴权等基础功能。

3、基础设施独立演进

传统微服务架构中,业务代码和框架、SDK等全都混合在一起,框架想要升级就会变得非常困难而且被动,一个地方有变动,所有相关的项目都需要升级。当微服务的数量变多时,想要在公司内推动框架的全量升级基本上就和重构差不多了(正好我们公司的项目在升级重构)。而Service Mesh 架构将框架中和业务无关的通用功能放在sidecar中,升级时只要升级sidecar就可以了,这样做到了基础设施的独立演进。

当然,这样也会导致Service Mesh拉长了网络请求的轨迹,在一套标准的云原生环境里,我们的流量可能需要先经过这么几个步骤:

集群外的负载均衡器 → 集群网关 → Service Mesh的Ingress → Sidecar → 业务服务

而且,后续链路每多一个业务服务,都会额外流经一个 Sidecar,即便如此多的基础设施名义上是为了保障业务稳定性,但每一个节点,也都同样会带来额外的隐患,一定程度上会降低通信系统性能,并增加系统资源开销。

4、简化系统网关的功能

实际上 sidecar 本身就是一个网关,或者说是反向代理,自然可以将以前 Nginx/Kong 之类的系统网关迁移到sidecar上来,这样就可以维护一套统一的代码。更进一步,可以将以前边缘网关的工作,比如鉴权、trace初始化等工作下沉到 sidecar 上,进一步简化系统网关的功能。但是,同时额外引入的大量Service Mesh服务实例的运维和管理也是一个挑战。

四、一点感触

整体来看,如果业务还处在一个起步阶段,还是不适合使用Service Mesh来进行开发,因为架构演进的一个重要的原则,就是组织架构要和技术架构相匹配,Service Mesh适合重构更胜于从零开始。

记得在刚刚学习Service Mesh的时候,有大佬曰:Service Mesh是微服务时代的TCP协议,历史总是惊人的相似。为了解决端到端的字节码通信问题,TCP协议诞生,让多机通信变得简单可靠;微服务时代,Service Mesh应运而生,屏蔽了分布式系统的诸多复杂性,让开发者可以回归业务,聚焦真正的价值。

到底是忠实于技术,还是回归于业务,对于我这样的普通程序员而言,还是太过遥远,但是却能让我们慢慢地看清自己的道路。

正如我的签名所言,一步一天,是为通天,不积跬步,又如何能通向自己的梦想呢?

有需要的同学可以加我的公众号,以后的最新的文章第一时间都会提醒更新,也可以找我要思维导图或者一起交流对技术、对业务的看法。

posted @ 2021-01-26 16:01  南橘ryc  阅读(394)  评论(0编辑  收藏  举报