微服务之Service Mesh浅析

2021-12-09 20:51:34 浏览数 (1)

随着技术体系的不断革新,基于原有的模式或思路使得软件的架构越来越难以维护,无论是国外还是国内的软件行业,都得到进一步的证实。依据各大主流技术论坛或者商业网站,目测,全球大约有85%以上的企业计划使用或者正在使用微服务体系生态。毕竟,原有的单一架构体系难以继续开发和持续维护,而基于微服务生态则允许使用较小的目标服务来实现更大的敏捷性收益。

然而,我们发现,在实际的业务场景中,随着组织构建更多的微服务(通常基于不同的编程语言和部署模型),使得它们最终会面临复杂的环境,这些环境可能会使得成本高昂且难以操作。这种复杂性在某种意义上扼杀了创新,公然违背了微服务的初衷。

那么,企业如何能够全面、大规模地维护和管理所有服务以及如何使得我们的微服务依据业务的复杂性能够很好的落地呢? 这是一个值得深思的话题,同时也是一个必须面对、解决的问题。由此,Service Mesh 技术应运而生,解决了这一痛点。

首先,我们先了解下在实际的业务场景中,常用的微服务逻辑架构,具体如下图所示:

什么是 Service Mesh ?

Service Mesh 这个概念最早由开发Linkerd 的 Buoyant, Inc 公司 CEO William Morgan 提出:服务网格即通过将这些功能插入平台层而非应用程序层来向应用程序添加可观察性,安全性和可靠性功能的工具。具体什么意思呢?首先,Service Mesh 是一个专门负责请求可靠传输的基础架构层,也就是说它是一种底层框架,其次,Service Mesh 与应用部署在一起,通过网络代理来实现,使得应用程序无感知。

服务网格是微服务部署的一种体系结构模式,通常被实现为与应用程序代码一起部署的可伸缩网络代理集(一种有时称为Sidecar的模式)。这些代理处理微服务之间的通信,并充当可以引入服务网格功能的点。代理服务器组成服务网格的数据平面,并由其控制平面进行整体控制。其主要目标是确保服务之间的通信安全,快速和可靠。

对于Service Mesh 的概念其所负有的职责边界,William Morgan 对其进行明确的补充:服务网格的兴起与“云原生”应用程序的兴起息息相关。在云原生世界中,一个应用程序可能包含数百个服务。每个服务可能有数千个实例;而且这些实例中的每一个实例都可能处于不断变化的状态,因为它们是由像Kubernetes这样的协调器动态调度的。在这个世界中,服务之间的通信不仅非常复杂,而且是应用程序运行时行为的基本组成部分。管理它对于确保端到端性能,可靠性和安全性至关重要。

基于上述所述,我们来看下Service Mesh 简要架构图,具体如下所示:

基于上述架构图,我们可以得知:在服务网格体系结构中,给定部署或集群中的微服务通过 Sidecar 代理相互交互。这些交互背后的安全和通信规则是通过控制平面定向的。开发人员可以在控制平面级别配置和添加策略,并且可以抽象化微服务背后的治理注意事项,而与构建技术无关。流行的Service Mesh框架(例如Istio)应运而生,以帮助组织实施这些体系结构模式。下面我们对Service Mesh 架构中的核心组件进行简要解析,具体如下:

SideCar 模式

SideCar 模式是 Service Mesh 的一个核心关键要素。首先来看熟悉下在传统的微服务中体系中,服务与服务之间是怎样进行交互,具体如下图所示:

在上述的服务调用链路中,NetworkFunctions 组件即我们所说的业务场景中所具备的熔断降级,负载均衡等一系列的相关功能。那么,对于我们新一代微服务 Service Mesh 其服务之间的相互调用又是怎样的呢?具体可参考如下图示:

基于上述服务调用链-Service Mesh,我们可以看到,原本服务框架中需要在我们每个服务里面实现的一些框架功能,诸如,服务发现、负载均衡、熔断降级均已由 SideCar来 实现,而我们的服务代码、业务代码再也不用关心与业务本身无关的内容。

Control Plane

基于上述的解析,我们知道 Sidecar 实现了服务的拦截调用功能,所有的服务都通过 SideCar 来进行转发和流量处理,这样所有的 Sidecar 再通过一个Control Plane 作为中心点来管控全局,这就形成了一个服务网格。有了前面 SideCar 的作用,Control Plane 作为一个中心点的作用就很明显了,具体如下:

1、服务发现,我们写的服务通过Sidecar 注册到 Control Plane 的注册中心,这样当,服务需要进行其他服务调用的时候,先经过 SideCar,然后 SideCar 去 Control Plane 注册中心查询相应的服务提供者的列表。

2、负载均衡,承接上一步,拿到了服务提供者的列表之后,SideCar 就根据一定的负载均衡算法选择一个节点进行调用。同时通过 ControlPlane 也可以修改这些 SideCar 的负载均衡算法。

3、请求路由,SideCar 从Control Plane 拿到服务提供者列表之后,也可以通过 Control Plane 来进行控制,例如 A/B Test、流量切换等等。

4、故障处理,服务之间调用如果出现故障,就需要加以控制、超时重传、熔断等,这些都可以通过 SideCar 转发时,通过 Control Plane 动态配置。

5、安全认证,通过 Control Plane 控制哪个服务可以被谁进行访问,以及访问哪些信息

监控上报,所有 SideCar 转发的信息都会经过 Control Plane,再由 Control Plane 发送给监控系统,例如Prometheus。

6、日志记录,所有 SideCar 转发的日志信息也会经过 Control Plane,再由 ControlPlane 发送给日志系统。

7、资源配额,例如可以在 Control Plane 里面对每个服务配置最大调用次数,这样 SideCar 转发调用时就会进行次数的审计。

上述我们简要解析了Service Mesh的基本架构、工作流,回到之前的问题,基于 Service Mesh 的应用,到底能够帮我们解决哪些问题?基于作者的浅薄经验,具体总结如下:

1、云原生的需要,在越来越多的微服务进行了容器化,并且开始在如 Kubernetes 这样的平台上运行。传统的服务治理,需要在业务代码里集成服务框架的SDK,这就比较麻烦,而Service Mesh 可以无侵入的进行服务治理,比较符合云原生的理念。具体可参考如下拓扑所示:

2、基于不同编程语言调用的需要,目前为止,支持微服务体系的语言较多,现有的很多开源微服务框架要么与特定的语言绑定如 Dubbo 和 Spring Cloud,仅支持 Java,要么是与语言无关如 gRPC,需要定义IDL文件,然后根据这个文件生成不同语言的Client 和Server,并且很多功能例如超时重传,负载均衡,服务发现等等。

那么,最后,我们真的需要Service Mesh 吗?

Service Mesh 已经被视为大部分基于微服务体系的公司的重要组成部分。根据Gartner和IDC的说法,将微服务部署到生产中的公司将需要某种形式的服务网格功能才能进行扩展。

但是,服务网格无法独自解决微服务生命周期中的所有挑战。组织仍然需要一种轻松地在团队之间发布和重用服务的方法。此外,如上所述,服务网格旨在在特定群集内进行服务到服务的通信。在典型的企业中,几种服务还将在任何一个特定域之外拥有消费者。

因此,企业需要一种方法来集中其服务的发现、管理和安全性,而与语言、域或部署模型无关。到此,关于Service Mesh (服务网格)相关内容解析为止,大家有什么问题,欢迎随时留言沟通。

0 人点赞