如何理解Service Mesh(服务网格)

好的,我们抛开复杂的术语,用一个清晰易懂的方式来解释 Service Mesh(服务网格)

核心概念:它是什么?

Service Mesh 是一个专门用来处理服务(微服务)之间通信的基础设施层。

想象一下,你的公司从一个单体大应用拆分成几十个微服务(比如用户服务、订单服务、支付服务等)。这些服务需要相互调用才能完成一个完整的业务请求。

  • 在没有 Service Mesh 之前:每个服务自己都要处理网络通信的复杂问题,比如:

    • 服务发现:订单服务怎么知道用户服务的地址在哪?

    • 负载均衡:用户服务有3个实例,订单服务该调用哪一个?

    • 重试机制:调用失败后,要不要重试?重试几次?

    • 熔断降级:如果用户服务宕机了,是快速失败还是返回一个默认值?

    • 安全认证:怎么确保调用我的是合法的订单服务,而不是黑客?

    • 监控追踪:一次请求经过了这么多服务,为什么变慢了?是哪个环节出了问题?

这些代码逻辑(通常叫"客户端负载均衡")会混杂在业务代码中,让业务代码变得臃肿,而且每个服务都要用同一种语言重复实现一遍,难以统一维护。

  • 有了 Service Mesh 之后 :它把这些通信相关的烦恼全部从你的业务代码中抽离出来,交给一个独立的基础设施来统一管理。

核心架构:它是如何工作的?

Service Mesh 通常采用 Sidecar(边车)模式 来实现,你可以把它想象成给每个微服务配了一个"通信秘书"。

  1. Sidecar 代理:为你部署的每一个微服务 Pod(Kubernetes 中的概念)都自动注入一个轻量级的网络代理容器。这个代理容器和你的业务容器在同一个 Pod 里,形影不离,就像摩托车的边车一样。

    • 最常见的 Sidecar 代理是 Envoy
  2. 数据平面 :所有这些 Sidecar 代理共同组成了 Service Mesh 的数据平面。它们负责处理所有进出微服务的网络流量。当订单服务要调用用户服务时,流量不是直接发过去的,而是先发给自己身边的 Sidecar,再由这个 Sidecar 代理转发给用户服务的 Sidecar,最后才到达用户服务。

    • 简单来说:服务间的通信,变成了 Sidecar 代理之间的通信。
  3. 控制平面 :另外,还有一个中心化的"大脑",称为控制平面 (例如 Istio 中的 istiod,Linkerd 中的 linkerd-destination)。它不直接处理数据包,而是负责管理和配置所有的 Sidecar 代理。你通过编写 YAML 文件告诉控制平面你的规则(比如:把 10% 的流量导到新版本),控制平面会把这些规则下发到全网所有的 Sidecar 代理中去执行。


核心功能:它能做什么?

通过这种架构,Service Mesh 为你提供了三大核心能力:

  1. 可观测性

    • 指标:自动生成服务间通信的详细指标,如请求量、错误率、延迟等。

    • 追踪:对一次请求穿越多个服务的完整路径进行追踪,轻松定位性能瓶颈。

    • 日志:提供详细的访问日志。

  2. 流量管理

    • 精细路由:实现金丝雀发布、蓝绿部署。例如,"将来自内部测试用户的 10% 的流量导入到新版本的服务"。

    • 故障恢复:配置重试、超时、熔断(当目标服务故障时,快速失败,避免雪崩效应)和故障注入(模拟服务故障,进行混沌测试)。

  3. 安全

    • mTLS:自动为服务间的通信进行双向 TLS 加密和身份认证,无需修改应用代码。

    • 访问控制:实现细粒度的"谁可以访问谁"的安全策略。


一个简单的比喻

  • 微服务:就像公司里的各个部门(市场部、销售部、财务部)。

  • 业务代码:是部门内部处理自己核心业务的流程。

  • 服务间通信的逻辑:就像是部门之间沟通协调的琐事(打电话、发邮件、预约会议、确认信息)。

  • Service Mesh :就像是给每个部门配了一位专业的秘书 。所有部门间的沟通都通过秘书来完成。秘书负责打电话、安排日程、记录沟通内容、处理沟通中的问题(比如对方忙线就重拨)。这样,部门里的员工就可以专注于自己的核心业务,而不用操心沟通的细节。

Service Mesh 的特点

Service Mesh 有如下几个特点:

  • 应用程序间通信的中间层
  • 轻量级网络代理
  • 应用程序无感知
  • 解耦应用程序的重试/超时、监控、追踪和服务发现

目前两款流行的 Service Mesh 开源软件 IstioLinkerd都可以直接在 Kubernetes 中集成,其中 Linkerd 已经成为 CNCF 中的项目。

理解 Service Mesh

如果用一句话来解释什么是 Service Mesh,可以将它比作是应用程序或者说微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控。对于编写应用程序来说一般无须关心 TCP/IP 这一层(比如通过 HTTP 协议的 RESTful 应用),同样使用 Service Mesh 也就无须关心服务之间的那些原本通过服务框架实现的事情,比如 Spring Cloud、Netflix OSS 和其他中间件,现在只要交给 Service Mesh 就可以了。

Phil Calçado在他的这篇博客 Pattern: Service Mesh中详细解释了 Service Mesh 的来龙去脉:

  1. 从最原始的主机之间直接使用网线相连
  2. 网络层的出现
  3. 集成到应用程序内部的控制流
  4. 分解到应用程序外部的控制流
  5. 应用程序的中集成服务发现和断路器
  6. 出现了专门用于服务发现和断路器的软件包/库,如 Twitter 的 FinagleFacebook 的 Proxygen,这时候还是集成在应用程序内部
  7. 出现了专门用于服务发现和断路器的开源软件,如 Netflix OSS、Airbnb 的 synapsenerve
  8. 最后作为微服务的中间层 Service Mesh 出现

总结

Service Mesh 的本质是解耦,它将复杂的服务通信问题(网络问题)从业务逻辑中解耦出来,使之成为一个独立的、可统一管理的基础设施层。 它让开发者更专注于业务创新,让运维者拥有更强大的网格治理能力,是构建和管理大规模复杂微服务架构的利器。

参考文档

https://jimmysong.io/blog/what-is-a-service-mesh/

相关推荐
小马过河R3 小时前
K8s引入Service Mesh原因及Istio入门
云原生·容器·kubernetes·k8s·istio·service_mesh
行者Sun19894 小时前
【K8s】Kubernetes 虚拟机管理工具之 KubeVirt
云原生·容器·kubernetes
孙克旭_5 小时前
kind部署K8S集群并将“修仙业务“部署到kind集群
linux·运维·云原生·kubernetes·kind
阿里云云原生14 小时前
探展打卡 Serverless,2025 云栖大会来了
云原生·serverless
杨杨杨大侠15 小时前
探索 Event 框架实战指南:微服务系统中的事件驱动通信:
java·spring boot·微服务·云原生·架构·系统架构
AKAMAI18 小时前
部署Linode Kubernetes引擎企业版的三种方式
人工智能·云原生·云计算
boonya19 小时前
Istio服务网格方案
云原生·istio·服务网格
zzz.1019 小时前
k8s中的Gateway API 和istio
云原生·kubernetes·gateway·istio
fie888920 小时前
在Kubernetes(k8s)环境中无法删除持久卷(PV)和持久卷声明(PVC)的解决方案
云原生·容器·kubernetes