1. 服务网格基础:什么是服务网格、Sidecar 代理模式、Istio/Envoy 架构概览
1.1 什么是服务网格
服务网格(Service Mesh)是云原生架构中用于处理服务间通信的基础设施层。它将流量管理、可观测性、安全策略从业务代码中剥离,下沉到独立的代理层,使开发者无需在应用内重复实现熔断、重试、超时等逻辑。
从拓扑角度看,服务网格由两部分构成:
- 数据平面(Data Plane):由一组轻量级代理(Sidecar)组成,负责拦截并处理进出服务的所有网络流量。
- 控制平面(Control Plane):集中管理数据平面代理的配置,下发路由规则、限流策略、TLS 证书等。
核心价值:服务网格实现了“通信即配置”,让运维人员通过声明式 API 控制服务间调用行为,无需修改业务代码。
1.2 Sidecar 代理模式
Sidecar 是服务网格的部署单元——每个服务实例旁边部署一个代理容器,所有入站和出站流量都经过该代理。这种模式带来以下优势:
| 维度 | 传统 SDK 模式 | Sidecar 代理模式 |
|---|---|---|
| 侵入性 | 需引入特定语言库,修改代码 | 零侵入,代理与业务容器独立 |
| 语言绑定 | 每种语言需单独适配 | 语言无关,代理统一处理 |
| 升级成本 | 业务应用需重新构建部署 | 仅升级代理容器,业务无感 |
| 故障隔离 | SDK 崩溃可能导致进程退出 | 代理故障不影响业务进程 |
Sidecar 代理的典型工作流程:
- 服务 A 发起 HTTP/gRPC 请求,流量被本地 Sidecar 拦截。
- Sidecar 根据控制平面下发的规则,执行负载均衡、重试、限流等策略。
- Sidecar 将请求转发至目标服务 B 的 Sidecar。
- 目标 Sidecar 将请求递交给服务 B 的业务容器。
1.3 Istio / Envoy 架构概览
Istio 是目前最成熟的服务网格实现,其数据平面默认使用 Envoy 代理,控制平面由 Istiod 统一管理。整体架构分为三层:
1.3.1 数据平面:Envoy 代理
Envoy 是一个高性能、C++ 编写的 L7 代理,具备以下核心能力:
- 流量拦截:通过 iptables 透明劫持所有入站/出站流量。
- 协议支持:HTTP/1.1、HTTP/2、gRPC、TCP、WebSocket 等。
- 高级负载均衡:支持加权轮询、最少请求、一致性哈希等算法。
- 内置熔断与限流:基于连接池、异常检测、本地限流实现弹性。
- 可观测性:自动生成访问日志、分布式追踪(Zipkin/Jaeger)、Prometheus 指标。
1.3.2 控制平面:Istiod
Istiod 是 Istio 的控制平面组件,整合了以下功能:
| 组件 | 职责 | 关键协议/接口 |
|---|---|---|
| Pilot | 服务发现、流量管理规则下发 | XDS(LDS/RDS/CDS/EDS) |
| Citadel | 证书签发、mTLS 身份认证 | SPIFFE 标准 |
| Galley | 配置验证、格式转换与分发 | Kubernetes CRD → 内部模型 |
性能关键点:Envoy 的 XDS 配置更新频率直接影响 Sidecar 的 CPU 开销。在限流降级策略频繁变更时,需关注控制平面配置推送的批量化与增量能力,避免因全量更新导致代理短暂阻塞。
1.4 限流降级在服务网格中的位置
在 Istio/Envoy 架构中,限流与降级策略通常配置在数据平面:
- 本地限流:Envoy 基于令牌桶算法,在 Sidecar 内直接拒绝超出阈值的请求,延迟极低(微秒级)。
- 全局限流:通过 Rate Limit Service(RLS)实现跨实例的精确限流,但会引入额外的 RPC 开销。
- 熔断降级:Envoy 的异常检测与连接池熔断,在检测到上游故障时快速失败,防止级联雪崩。