全方位详解微服务架构中的Service Mesh(服务网格)

发布于:2025-05-21 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、引言

随着微服务架构的广泛应用,微服务之间的通信管理、流量控制、安全保障等问题变得日益复杂。服务网格(Service Mesh)作为一种新兴的技术,为解决这些问题提供了有效的方案。它将服务间通信的管理从微服务代码中分离出来,构建了一个专门用于处理服务间通信的基础设施层。

二、服务网格的基本概念

(一)定义

服务网格是一个用于处理服务间通信的专用基础设施层。它通过在每个服务实例旁边部署一个代理(通常称为sidecar代理),来实现对服务间通信的控制和管理。这些代理相互协作,形成一个网状结构,从而实现诸如流量路由、负载均衡、服务发现、安全通信等功能。

(二)组成部分

数据平面(Data Plane)

由众多的sidecar代理组成,负责处理实际的网络流量,包括拦截进出服务实例的请求和响应,进行流量控制、日志记录、监控数据采集等操作。例如,在一个电商微服务架构中,当用户请求从产品服务到订单服务时,数据平面的代理会拦截这个请求,根据配置的规则进行处理,如添加请求头、进行流量限制等。

控制平面(Control Plane)

负责管理和配置数据平面的代理。它定义了服务间通信的策略,如路由策略、安全策略等,并将这些策略分发到各个sidecar代理。控制平面可以动态地调整这些策略,以适应微服务架构的变化。例如,当需要将一部分流量从旧版本的服务路由到新版本时,控制平面可以更新路由策略,并通知相应的代理执行新的路由规则。

三、服务网格在微服务架构中的应用

(一)流量管理

流量路由

服务网格可以根据多种条件进行流量路由,如根据请求的来源、请求的版本号或者用户的特定标识等。例如,在一个多版本的微服务应用中,可以通过服务网格将10%的流量路由到新版本的服务进行测试,而将90%的流量保持在旧版本,以便进行渐进式的版本升级。

负载均衡

传统的微服务负载均衡通常在服务发现组件或者客户端代码中实现,而服务网格将负载均衡功能下沉到sidecar代理。代理可以根据多种算法(如轮询、加权轮询、最少连接等)进行负载均衡。这使得负载均衡的策略更加灵活,并且可以根据实际的服务运行情况进行动态调整。例如,当某个服务实例的负载过高时,代理可以减少发送到该实例的流量。

(二)服务发现与注册

动态服务发现

在微服务架构中,服务实例可能会频繁地启动、停止或迁移。服务网格的控制平面可以实时跟踪服务实例的状态,将服务发现的功能从微服务代码中解耦出来。当一个新的服务实例启动时,它可以自动被服务网格发现并注册,其他服务可以通过服务网格轻松地找到这个新实例并与之通信。

跨环境服务发现

对于复杂的企业架构,可能存在多个不同的环境(如开发环境、测试环境、生产环境)。服务网格可以在这些不同环境之间实现统一的服务发现机制,使得在不同环境之间进行服务调用和集成更加方便。例如,在开发环境中对某个服务进行测试时,可以通过服务网格轻松地找到在测试环境中对应的服务实例。

(三)安全保障

加密通信

服务网格可以为服务间的通信提供加密功能,确保数据在传输过程中的安全性。sidecar代理可以在发送和接收数据时对数据进行加密和解密操作,防止数据被窃取或篡改。例如,在金融微服务架构中,涉及用户资金信息的服务间通信可以通过服务网格进行加密,保护用户的隐私和资金安全。

访问控制

服务网格可以定义精细的访问控制规则,确定哪些服务可以访问其他服务,以及在什么条件下可以访问。例如,可以设置只有经过身份验证和授权的服务才能访问包含敏感数据的服务,并且可以根据用户的角色或权限进一步限制访问的范围。

(四)可观测性

监控与指标采集

sidecar代理可以收集大量关于服务间通信的监控数据,如请求的延迟、吞吐量、错误率等。这些数据可以被汇总到监控系统中,帮助运维人员和开发人员全面了解微服务架构的运行状态。例如,通过监控数据可以发现某个服务的请求延迟突然增加,从而及时排查问题。

分布式追踪

服务网格可以实现分布式追踪功能,跟踪请求在多个微服务之间的传播路径。这有助于在复杂的微服务架构中定位问题的根源,例如当一个用户请求在多个服务间传递后出现错误时,可以通过分布式追踪确定是哪个服务或者哪个环节出现了问题。

四、服务网格的优势

(一)解耦微服务通信逻辑

降低微服务复杂度

传统微服务架构中,服务间通信的逻辑往往与业务逻辑混杂在一起,增加了微服务代码的复杂度。服务网格将通信逻辑分离出来,使得微服务可以更加专注于自身的业务逻辑,提高了微服务的可维护性和可扩展性。例如,开发人员在编写一个新的微服务时,不需要再考虑复杂的服务发现、负载均衡等通信相关的代码。

语言和框架无关性

服务网格对微服务使用的编程语言和框架没有限制。无论微服务是用Java、Python还是其他语言编写,都可以利用服务网格提供的功能。这使得企业在构建微服务架构时可以更加灵活地选择适合的技术栈。

(二)增强微服务架构的弹性

故障隔离与恢复

当某个服务实例出现故障时,服务网格可以通过动态调整流量路由,将请求绕过故障实例,从而实现故障隔离。同时,在故障修复后,又可以自动将流量重新分配到修复后的实例,实现快速的故障恢复。例如,在一个分布式的微服务系统中,如果一个服务节点出现硬件故障,服务网格可以迅速将原本发往该节点的流量分配到其他正常节点。

动态配置更新

控制平面可以动态地更新服务间通信的策略,无需重启微服务。这使得微服务架构能够快速适应业务需求的变化,如在流量高峰期调整负载均衡策略,或者在安全漏洞修复后更新安全策略。

五、服务网格的挑战与应对

(一)性能开销

代理的资源消耗

sidecar代理的运行会消耗一定的系统资源,如CPU、内存等。在大规模的微服务架构中,如果代理的资源消耗过大,可能会影响整个系统的性能。为了应对这一问题,可以对代理进行优化,例如采用高效的编程语言和算法,以及合理配置代理的资源限制。

网络延迟增加

由于数据需要经过sidecar代理进行处理,可能会增加网络延迟。可以通过优化代理的网络处理逻辑,如采用异步处理、缓存机制等,来降低网络延迟的影响。

(二)学习曲线与复杂度

技术的复杂性

服务网格涉及到多个概念和技术组件,对于开发人员和运维人员来说,存在一定的学习曲线。企业可以通过提供培训课程、文档资料等方式,帮助团队成员掌握服务网格的相关知识和技能。

多组件集成的复杂性

在实际应用中,服务网格需要与现有的微服务架构、监控系统、安全系统等进行集成,这增加了系统的整体复杂度。在集成过程中,需要仔细规划和设计,确保各个组件之间的兼容性和协同工作能力。

服务网格在微服务架构中的应用为解决服务间通信和管理等问题提供了强大的解决方案。它通过将通信管理从微服务中分离出来,提供了流量管理、服务发现、安全保障和可观测性等多方面的功能,提升了微服务架构的整体性能、安全性和可维护性。尽管存在一些挑战,但随着技术的不断发展和实践经验的积累,服务网格有望在未来的微服务架构中发挥更加重要的作用。

Service Mesh的主要实现原理

Service Mesh 是一种新型的用于处理服务与服务之间通信的技术,尤其适用于以云原生应用形式部署的服务,能够保证服务与服务之间调用的可靠性。在实际部署时,Service Mesh 通常以轻量级的网络代理方式与应用的代码部署在一起,从而以应用无感知的方式实现服务治理。

1、与传统的微服务架构的本质区别

Service Mesh 以轻量级的网络代理方式与应用的代码部署在一起,用于保证服务与服务之间调用的可靠性,这与传统的微服务架构有着本质区别,具体体现在以下两点。

  • 跨语言服务调用的需要。大多数公司通常都存在多个业务团队,每个团队业务所采用的开发语言一般都不相同。比如移动服务端的业务主要采用的是 PHP 语言开发,API 平台的业务主要采用的是 Java 语言开发,移动服务端调用 API 平台使用的是 HTTP 请求。如果要进行服务化,改成 RPC 调用,就需要一种既支持 PHP 语言又支持 Java 语言的服务化框架。
  • 云原生应用服务治理的需要。现在微服务越来越多开始容器化,并使用类似 Kubernetes 的容器平台对服务进行管理,逐步向云原生应用的方向进化。而传统的服务治理要求在业务代码里集成服务框架的 SDK,这显然与云原生应用的理念相悖,因此迫切需要一种对业务代码无侵入的适合云原生应用的服务治理方式。
2、Service Mesh 实现原理

服务 A 要调用服务 B,经过 Linkerd 来代理转发,服务 A 和服务 B 的业务代码不需要关心服务框架功能的实现。为此 Linkerd 需要具备负载均衡、熔断、超时重试、监控统计及服务路由等功能。这样,对于跨语言服务调用来说,即使服务消费者和服务提供者采用的语言不同,也不需要集成各自语言的 SDK。

可见 Service Mesh 的实现原理有以下两个。

  • 一个是轻量级的网络代理,也被称为 SideCar,它的作用就是转发服务之间的调用。
  • 一个是基于 SideCar 的服务治理,也被称为 Control Plane,它的作用是向 SideCar 发送各种指令,以完成各种服务治理功能。
3、SideCar

在 Service Mesh 架构中,服务框架的功能都集中在 SideCar 中实现,并在每一个服务消费者和服务提供者的本地都部署一个 SideCar,服务消费者和服务提供者只负责自己的业务实现,服务消费者向本地的 SideCar 发起请求,本地的 SideCar 根据请求的路径向注册中心查询,得到服务提供者的可用节点列表后,再根据负载均衡策略选择一个服务提供者节点,并向这个节点上的 SideCar 转发请求,服务提供者节点上的 SideCar 完成流量统计、限流等功能后,再把请求转发给本地部署的服务提供者进程,从而完成一次服务请求。

服务消费者节点上的 SideCar 称为正向代理,服务提供者节点上的 SideCar 称为反向代理,Service Mesh 架构的关键点就在于服务消费者发出的请求如何通过正向代理转发,以及服务提供者收到的请求如何通过反向代理转发。

4、Control Plane

SideCar 能实现服务之间的调用拦截功能,那么服务之间的所有流量都可以通过 SideCar 来转发,这样所有的 SideCar 就组成了一个服务网格,再通过一个统一的地方与各个 SideCar 交互,就能控制网格中流量的运转了,这个统一的地方在 Service Mesh 中就被称为 Control Plane。

Control Plane 包括以下功能:

  • 服务发现

服务提供者会通过 SideCar 注册到 Control Plane 的注册中心,这样服务消费者把请求发送给 SideCar 后,SideCar 就会查询 Control Plane 的注册中心来获取服务提供者节点列表。

  • 负载均衡

SideCar 从 Control Plane 获取到服务提供者节点列表信息后,需要按照一定的负载均衡算法从可用的节点列表中选取一个节点发起调用,可以通过 Control Plane 动态修改 SideCar 中的负载均衡配置。

  • 请求路由

SideCar 从 Control Plane 获取的服务提供者节点列表,也可以通过 Control Plane 来动态改变,如需要进行 A/B 测试、灰度发布或者流量切换时,就可以动态地改变请求路由。

  • 故障处理

服务之间的调用如果出现故障,就需要加以控制,常用的手段有超时重试、熔断等,这些都可以在 SideCar 转发请求时,通过 Control Plane 动态配置。

  • 安全认证

可以通过 Control Plane 控制一个服务可以被谁访问,以及访问哪些信息。

  • 监控上报

所有 SideCar 转发的请求信息都会发送到 Control Plane,再由 Control Plane 发送给监控系统,如 Prometheus 等。

  • 日志记录

所有 SideCar 转发的日志信息也会发送到 Control Plane,再由 Control Plane 发送给日志系统,如 Stackdriver 等。

  • 配额控制

可以在 Control Plane 中为服务的每个调用方配置最大调用次数,在 SideCar 转发请求给某个服务时,会审计调用是否超出服务对应的次数限制。

微服务实战-Service Mesh与Istio

阿里云实战课程:微服务实战-Service Mesh与Istio_学习资源库_阿里云培训中心-阿里云

Service Mesh与微服务框架中的组件比较

在数字化转型的旗帜下,IT界的一大变化是大型单体应用程序被分解为微服务架构,即小型、离散的功能单元,并且这些应用程序在容器中运行。包含所有服务代码以及依赖项的软件包被隔离起来,并且能轻松从一个服务器迁移到另一个。

像这样的容器化架构很容易在云中扩展和运行,并且能够快速迭代和推出每个微服务。然而,当应用程序越来越大并且在同一个服务上同时运行多个实例时,微服务之间通信将会变得愈发复杂。Service mesh的出现将解决这一问题,它是一个新兴的架构形式,旨在以减少管理和编程开销的形式来连接这些微服务。

什么是Service mesh?

关于Service mesh的定义,最为广泛接受的观点是:它是一种控制应用程序不同部分彼此共享数据的方式。这一描述包含了service mesh的方方面面。事实上,它听起来更像是大多数开发人员从客户端-服务器应用程序中熟悉的中间件。

Service mesh也有其独特之处:它能够适应分布式微服务环境的独特性质。在搭建在微服务中的大规模应用程序中,有许多既定的服务实例,它们跨本地和云服务器运行。所有这些移动部件显然使得各个微服务难以找到他们需要与之通信的其他服务。Service mesh可以在短时间内自动处理发现和连接服务,而无需开发人员以及各个微服务自行匹配。

我们可以将service mesh等同为软件定义网络(SDN)的OSI网络模型第7层。正如SDN创建一个抽象层后网络管理员不必处理物理网络连接,service mesh将解耦在抽象架构中的与你交互的应用程序的底层基础架构。

随着开发人员开始努力解决真正庞大的分布式架构的问题,service mesh的概念适时地出现了。这一领域的第一个项目是Linkerd,它一开始是Twitter内部项目的一个分支。Istio是另一个十分流行的service mesh项目,它起源于Lyft,现在这一项目获得了许多企业的支持。

Service mesh负载均衡

Service mesh其中一个关键功能是负载均衡。我们常常将负载均衡视为网络功能——你想要防止服务器或网络链接被流量淹没,因此相应地你会路由你的数据包,而Service mesh在应用程序层面也在执行类似的事情。

本质上,Service mesh的工作之一是跟踪分布在基础设施上的各种微服务的哪些实例是“最健康的”。它可能对他们进行调查来查看它们如何工作的或跟踪哪些实例对服务请求响应缓慢并将后续请求发送到其他实例。此外,service mesh也会为网络路由做类似的工作,如果发现当消息需要很长时间才能送达,那么service mesh将会采用其他路由进行补偿。这些减速可能是由于底层硬件出现问题,或者仅仅是由于服务因请求过载或处理能力不足导致的。但没有关系,service mesh会找到另一个相同服务的实例,然后将其路由以替代响应缓慢的实例,高效利用了整个应用程序的资源。

Service mesh vs Kubernetes

如果你稍微熟悉基于容器的架构,你可能会想Kubernetes这个流行的开源容器编排平台能否适合这种情况。毕竟,Kubernetes不就是管理着你的容器之间如何互相通信的吗?你可将Kubernetes“服务”资源视为非常基础的service mesh,因为它提供服务发现和请求的轮询调度均衡。但是完整的service mesh则提供更丰富的功能,如管理安全策略和加密、“断路”以暂停对缓慢响应的实例的请求以及如上所述的负载均衡等。

请记住,大多数service mesh确实需要像Kubernetes这样的编排系统。Service mesh只是提供扩展功能,而非替代编排平台。

Service mesh vs API 网关

每个微服务都会提供一个API,它会作为其他服务与其通信的手段。这引发了service mesh与其他更传统的API管理形式(如API网关)之间的差异问题。API网关位于一组微服务和“外部”世界之间,它根据需要路由服务请求,以便请求者不需要知道它正在处理基于微服务的应用程序即可完成请求。而service mesh调解微服务应用程序内部的请求,各种组件完全了解其环境。

另一方面,service mesh用于优化集群内东西流量(server-server流量),API网关用于进出集群的南北流量(server-client流量)。但service mesh目前依旧处于早期阶段还在不断发展变化中。许多service mesh(包括Linkerd和Istio)现在已经可以提供南北功能。

Service mesh 架构

Service mesh这一概念其实出现的时间并不长,并且已经有相当数量的不同的方法来解决“service mesh”的问题,如管理微服务通信。目前,确定了三种service mesh创建的通信层可能存在的位置:

  • 每个微服务导入的library
  • 在特定节点提供服务给所有容器的节点agent
  • 与应用程序容器一起运行的sidecar容器

基于sidecar的模式目前是service mesh最受欢迎的模式之一,以至于它在某种程度上已经成为了service mesh的代名词。尽管这种说法并不严谨,但是sidecar已经引起了很大的关注,我们将在下文更详细地研究这一架构。

Sidecar

Sidecar容器与你的应用程序容器一起运行意味着什么呢?在这类service mesh中每个微服务容器都有另一个proxy容器与之相对应。所有的服务间通信的需求都会被抽象出微服务之外并且放入sidecar。

这似乎很复杂,毕竟你有效地将应用程序中的容器数量增加了1倍。但你使用的这一种设计模式对于简化分布式应用程序至关重要。通过将所有的网络和通信代码放到单独的容器中,将其作为基础架构的一部分,并使开发人员无需将其作为应用程序的一部分实现。

本质上,你所留下的是一个聚焦于业务逻辑的微服务。这个微服务不需要知道如何在其运行的环境中与所有其他服务进行通信。它只需要知道如何与sidecar进行通信即可,剩下的将由sidecar完成。

Service mesh明星项目:Linkerd、Envoy、Istio、Consul

那么说了这么多,什么是可用的service mesh呢?目前,这一领域还没有出现完全现成的商业产品。大部分的service mesh只是开源项目,需要通过一定的操作步骤才能实现,现在比较知名的项目有:

  • Linkerd:2016年发布,是这些项目中最老的。Linkerd是从Twitter开发的library中分离出来的。在这一领域另一位重量型选手,Conduit,已经进入了Linkerd项目并构成了Linkerd 2.0的基础。
  • Envoy:由Lyft创建,为了能够提供完整的service mesh功能,Envoy占据“数据平面”的部分,与其进行匹配。
  • Istio:由Lyft、IBM与google联合开发,Istio可以在不修改微服务源代码的情况下,轻松为其加上如负载均衡、身份验证等功能,它可以通过控制Envoy等代理服务来控制所有的流量。此外,Istio提供容错、金丝雀部署、A/B测试、监控等功能,并且支持自定义的组件和集成。 Rancher 2.3 Preview2版本上开始支持Istio,用户可以直接在UI界面中启动Istio并且可以为每个命名空间注入自动sidecar。Rancher内置了一个支持Kiali的仪表盘,简化Istio的安装和配置。这一切让部署和管理Istio变得简单而快速。
  • HashiCorp Consul:与Consul 1.2一起推出了一项名为Connect的功能,为HashiCorp的分布式系统添加了服务加密和基于身份的授权,可用于服务发现和配置。

网站公告

今日签到

点亮在社区的每一天
去签到