mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
2386 字
7 分钟
为什么需要服务网格
2024-05-25

微服务架构解决了单体应用的诸多问题,但也带来了新的挑战:服务数量爆炸式增长,服务间通信变得异常复杂。服务网格(Service Mesh)应运而生,成为云原生时代微服务治理的。为什么需要服务网格?它解决了什么问题?

一、微服务通信的复杂性#

1.1 从单体到微服务#

单体应用时代,模块之间通过方法调用通信,简单直接。微服务架构将单体拆分为多个独立服务,通信方式发生根本变化:

flowchart TB subgraph 单体应用 M[单体应用] --> A[模块A] M --> B[模块B] M --> C[模块C] A <-->|方法调用| B B <-->|方法调用| C end subgraph 微服务架构 S1[服务A] <-->|网络调用| S2[服务B] S2 <-->|网络调用| S3[服务C] S1 <-->|网络调用| S3 S2 <-->|网络调用| S4[服务D] S3 <-->|网络调用| S4 end M -->|拆分| S1

通信方式变化

维度单体应用微服务架构
通信方式方法调用网络调用
通信可靠性内存访问可靠网络不可靠
调用延迟微秒级毫秒级
故障影响局部异常级联故障

1.2 服务数量的指数级增长#

以一个电商系统为例:

flowchart LR subgraph 核心服务 U[用户服务] O[订单服务] P[商品服务] I[库存服务] PM[支付服务] end subgraph 基础服务 A[认证服务] C[配置服务] N[通知服务] L[日志服务] end U <--> O O <--> P O <--> I O <--> PM U <--> A O <--> C O <--> N P <--> L

当服务数量从个位数增长到数十甚至上百个时,服务间调用关系呈指数级增长:

# 服务调用关系数量计算
def count_relationships(service_count):
"""
N 个服务之间可能有 N * (N-1) 条调用关系
"""
return service_count * (service_count - 1)
# 10 个服务:90 条调用关系
# 50 个服务:2450 条调用关系
# 100 个服务:9900 条调用关系

1.3 分布式系统的八大谬误#

L. Peter Deutsch 提出的分布式系统八大谬误,揭示了开发者对网络通信的误解:

mindmap root((分布式系统八大谬误)) 网络是可靠的 网络会断开 丢包是常态 延迟为零 网络延迟不可忽略 跨机房延迟更高 带宽是无限的 带宽有上限 需要压缩传输 网络是安全的 数据可能被窃取 需要加密通信 拓扑不会改变 服务动态扩缩容 IP 经常变化 只有一个管理员 多团队协作 配置可能冲突 传输成本为零 序列化有开销 网络带宽有成本 网络是同构的 协议不统一 版本不兼容

这些谬误意味着:微服务通信远比想象中复杂

二、传统微服务框架的困境#

2.1 第一代微服务框架#

以 Spring Cloud、Dubbo 为代表的第一代微服务框架,将服务治理能力嵌入应用代码:

flowchart TB subgraph 应用程序 B[业务代码] F[框架代码] end subgraph 框架能力 R[服务注册发现] L[负载均衡] C[熔断限流] T[链路追踪] S[服务认证] end B --> F F --> R F --> L F --> C F --> T F --> S

Spring Cloud 的组件栈

组件功能
Eureka/Consul服务注册发现
Ribbon负载均衡
Hystrix熔断器
Zuul/Spring Cloud GatewayAPI 网关
Sleuth链路追踪
Config配置中心

2.2 语言绑定的困境#

flowchart LR subgraph Java 服务 J[Java 服务] --> SC[Spring Cloud SDK] end subgraph Go 服务 G[Go 服务] --> GC[Go Micro SDK] end subgraph Python 服务 P[Python 服务] --> PC[Python SDK] end SC -.-x|无法互通| GC GC -.-x|无法互通| PC PC -.-x|无法互通| SC Note: 不同语言的 SDK 不兼容

问题

  • 每种语言需要独立的 SDK 实现
  • 功能能力参差不齐
  • 团队技能要求高
  • 升级维护成本高

2.3 代码侵入的代价#

// Spring Cloud 代码示例
@Service
public class OrderService {
@LoadBalanced // 负载均衡注解
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "fallback") // 熔断注解
public Order getOrder(String orderId) {
return restTemplate.getForObject(
"http://order-service/orders/" + orderId,
Order.class
);
}
public Order fallback(String orderId) {
return new Order(); // 降级逻辑
}
}

侵入式设计的问题

问题说明
业务耦合服务治理代码与业务代码混在一起
升级困难SDK 升级需要修改业务代码
调试复杂框架行为难以追踪
技术债务框架迁移成本高

2.4 重复建设的泥潭#

每个服务都需要实现相同的服务治理能力:

flowchart TB subgraph 服务A BA[业务逻辑] SA1[服务发现] SA2[负载均衡] SA3[熔断限流] SA4[链路追踪] end subgraph 服务B BB[业务逻辑] SB1[服务发现] SB2[负载均衡] SB3[熔断限流] SB4[链路追踪] end subgraph 服务C BC[业务逻辑] SC1[服务发现] SC2[负载均衡] SC3[熔断限流] SC4[链路追踪] end Note: 相同能力重复实现 N 次

重复建设的后果

  • 开发效率低下
  • 一致性难以保证
  • 维护成本线性增长
  • 新功能推广困难

三、Sidecar 模式:解耦的关键#

3.1 什么是 Sidecar 模式?#

Sidecar 模式将应用的关注点分离,将辅助功能部署在独立的进程中:

flowchart TB subgraph Pod/主机 subgraph 应用容器 A[业务应用] end subgraph Sidecar 容器 P[Proxy<br/>Envoy/MOSN] end A <-->|localhost| P end P <-->|网络| E[外部服务]

设计理念

将服务治理能力从应用代码中剥离,放入独立的 Sidecar 代理中。应用只关注业务逻辑,Sidecar 负责所有通信治理。

3.2 Sidecar 的工作原理#

sequenceDiagram participant App as 应用进程 participant Sidecar as Sidecar 代理 participant Service as 目标服务 App->>Sidecar: 发送请求(localhost) Sidecar->>Sidecar: 服务发现 Sidecar->>Sidecar: 负载均衡 Sidecar->>Sidecar: 熔断检查 Sidecar->>Service: 转发请求 Service-->>Sidecar: 返回响应 Sidecar->>Sidecar: 链路追踪记录 Sidecar-->>App: 返回结果

3.3 Sidecar 的优势#

flowchart TB subgraph Sidecar 优势 L[语言无关] N[非侵入] U[统一治理] I[独立升级] end L --> L1[任意语言应用<br/>使用相同的 Sidecar] N --> N1[业务代码无感知<br/>无需修改] U --> U1[所有服务治理策略<br/>统一配置] I --> I1[Sidecar 升级<br/>不影响应用]
优势说明
语言无关Sidecar 是独立进程,不依赖语言
非侵入业务代码无需引入 SDK
统一治理所有流量通过 Sidecar,统一管控
独立升级Sidecar 升级与业务解耦
故障隔离Sidecar 故障不影响应用主进程

3.4 Kubernetes 中的 Sidecar 注入#

flowchart TB subgraph Pod subgraph 原始容器 C1[业务容器] end subgraph 注入后 C2[业务容器] S[Sidecar 容器<br/>Envoy] I[Init 容器<br/>iptables 设置] end end C1 -->|创建 Pod 时| I I -->|设置 iptables| S S -->|接管流量| C2 Note: Kubernetes 自动注入 Sidecar

iptables 流量劫持原理

# 所有出站流量重定向到 Sidecar
iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-port 15001
# 所有入站流量重定向到 Sidecar
iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-port 15006

四、服务网格架构:数据平面与控制平面#

4.1 服务网格的定义#

服务网格是一个专门处理服务间通信的基础设施层:

flowchart TB subgraph 服务网格 subgraph 数据平面 P1[Proxy 1] P2[Proxy 2] P3[Proxy 3] P4[Proxy 4] end subgraph 控制平面 CP[Control Plane] end CP -->|下发配置| P1 CP -->|下发配置| P2 CP -->|下发配置| P3 CP -->|下发配置| P4 P1 <-->|通信| P2 P2 <-->|通信| P3 P3 <-->|通信| P4 end subgraph 应用服务 S1[服务A] S2[服务B] S3[服务C] S4[服务D] end S1 <--> P1 S2 <--> P2 S3 <--> P3 S4 <--> P4

4.2 数据平面(Data Plane)#

数据平面由一系列 Sidecar 代理组成,负责实际的服务间通信:

flowchart LR subgraph 数据平面职责 T[流量代理] L[负载均衡] R[路由转发] C[熔断限流] S[安全认证] M[监控上报] end T --> T1[拦截所有服务间流量] L --> L1[多种负载均衡算法] R --> R1[按规则路由请求] C --> C1[保护服务免受过载] S --> S1[mTLS 双向认证] M --> M1[指标、日志、追踪]

主流数据平面实现

代理特点使用场景
EnvoyC++ 实现,高性能,功能全面Istio 默认
MOSNGo 实现,云原生,支持多协议SOFAMesh
LinkerdRust 实现,轻量级Linkerd

4.3 控制平面(Control Plane)#

控制平面负责管理和配置数据平面:

flowchart TB subgraph 控制平面 subgraph 配置管理 C1[路由规则] C2[负载均衡策略] C3[熔断限流配置] C4[安全策略] end subgraph 服务发现 S[服务注册表] end subgraph 证书管理 CA[CA 证书] end end subgraph 数据平面 P1[Proxy 1] P2[Proxy 2] P3[Proxy 3] end C1 --> P1 C2 --> P1 C3 --> P1 C4 --> P1 S --> P1 CA --> P1 Note: 控制平面通过 xDS API 下发配置

控制平面职责

职责说明
配置分发将路由、负载均衡等配置下发给代理
服务发现维护服务注册表,推送给代理
证书管理签发和管理 mTLS 证书
健康检查监控代理和服务健康状态
策略执行统一执行安全、流量等策略

4.4 xDS 协议#

控制平面通过 xDS API 向数据平面下发配置:

flowchart LR subgraph xDS API LDS[Listener DS<br/>监听器] RDS[Route DS<br/>路由] CDS[Cluster DS<br/>集群] EDS[Endpoint DS<br/>端点] SDS[Secret DS<br/>证书] end subgraph 控制平面 CP[Istiod] end subgraph 数据平面 E[Envoy] end CP -->|gRPC/REST| LDS CP -->|gRPC/REST| RDS CP -->|gRPC/REST| CDS CP -->|gRPC/REST| EDS CP -->|gRPC/REST| SDS LDS --> E RDS --> E CDS --> E EDS --> E SDS --> E

xDS 类型说明

xDS 类型说明用途
LDSListener Discovery配置监听器(端口等)
RDSRoute Discovery配置路由规则
CDSCluster Discovery配置上游集群
EDSEndpoint Discovery配置服务实例
SDSSecret Discovery分发证书和密钥

五、Istio 架构剖析#

5.1 Istio 整体架构#

Istio 是最流行的服务网格实现:

flowchart TB subgraph 控制平面 - Istiod P[Pilot<br/>配置分发] C[Citadel<br/>证书管理] G[Galley<br/>配置验证] end subgraph 数据平面 subgraph Pod 1 A1[应用容器] E1[Envoy] end subgraph Pod 2 A2[应用容器] E2[Envoy] end subgraph Pod 3 A3[应用容器] E3[Envoy] end end subgraph 外部组件 K[API Server<br/>Kubernetes] PR[Prometheus] J[Jaeger] KAF[Kafka] end P -->|xDS| E1 P -->|xDS| E2 P -->|xDS| E3 C -->|证书| E1 C -->|证书| E2 C -->|证书| E3 G -->|验证| P P -->|服务发现| K E1 -->|指标| PR E2 -->|追踪| J E3 -->|日志| KAF

5.2 Istiod 的演进#

早期 Istio 控制平面由多个组件组成,后统一为 Istiod:

timeline title Istio 控制平面演进 2017 : Istio 0.1 发布 : Pilot, Mixer, Citadel 独立部署 2018 : Istio 1.0 发布 : 生产就绪,组件仍独立 2019 : Istio 1.5 发布 : Mixer 移除,合并为 Istiod 2020 : Istio 1.7 发布 : 单体 Istiod 稳定 2022 : Istio 1.14 发布 : Ambient Mode 预览

为什么合并为单体?

原因说明
简化部署单一组件,运维更简单
减少延迟组件间通信变为进程内调用
降低资源消耗避免多组件重复的基础开销
一致性保证单进程内状态一致,无同步问题

5.3 Envoy 代理详解#

Envoy 是 Istio 数据平面的核心:

flowchart TB subgraph Envoy 架构 subgraph 下游 D1[客户端连接] end subgraph 监听器 L[Listener] F[Filter 链] end subgraph 路由 R[Router] end subgraph 集群 C1[Cluster A] C2[Cluster B] end subgraph 上游 U1[后端服务 A] U2[后端服务 B] end D1 --> L L --> F F --> R R --> C1 R --> C2 C1 --> U1 C2 --> U2 end

Envoy 核心概念

概念说明
Listener监听器,接收入站连接
Filter过滤器链,处理请求/响应
Route路由配置,决定请求转发目标
Cluster上游服务集群,包含多个 Endpoint
Endpoint具体的服务实例地址

5.4 Envoy Filter 扩展#

Envoy 通过 Filter 链扩展功能:

flowchart LR subgraph 请求处理流程 R[请求] --> L1[网络层 Filter] L1 --> L2[HTTP Filter 1] L2 --> L3[HTTP Filter 2] L3 --> L4[路由匹配] L4 --> U[上游服务] end subgraph Filter 类型 F1[网络 Filter<br/>TCP/UDP] F2[HTTP Filter<br/>HTTP/gRPC] F3[自定义 Filter<br/>Lua/WASM] end

常用 Filter

# Istio 默认启用的 Filter
http_filters:
- name: istio.stats # 指标收集
- name: istio.stackdriver # 云监控
- name: envoy.lua # Lua 脚本
- name: envoy.wasm # WASM 扩展

六、服务网格核心功能#

6.1 流量管理#

6.1.1 请求路由#

flowchart TB subgraph 路由规则 R[请求] --> V{版本判断} V -->|Header: canary| S2[v2 服务] V -->|默认| S1[v1 服务] end subgraph Istio 配置 VSC[VirtualService] DR[DestinationRule] end VSC -->|路由规则| V DR -->|版本定义| S1 DR -->|版本定义| S2

配置示例

# VirtualService:定义路由规则
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- match:
- headers:
x-version:
exact: "v2"
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1
weight: 90
- destination:
host: reviews
subset: v2
weight: 10 # 10% 流量到 v2

6.1.2 流量切换(灰度发布)#

sequenceDiagram participant User as 用户 participant VS as VirtualService participant V1 as v1 服务 participant V2 as v2 服务 Note over VS: 初始:100% v1 User->>VS: 请求 VS->>V1: 100% 流量 Note over VS: 第一阶段:90% v1, 10% v2 User->>VS: 请求 VS->>V1: 90% 流量 VS->>V2: 10% 流量 Note over VS: 第二阶段:50% v1, 50% v2 User->>VS: 请求 VS->>V1: 50% 流量 VS->>V2: 50% 流量 Note over VS: 最终:100% v2 User->>VS: 请求 VS->>V2: 100% 流量

6.1.3 故障注入#

flowchart TB subgraph 正常请求 R1[请求] --> S1[服务] --> R2[响应] end subgraph 故障注入 R3[请求] --> I{注入类型} I -->|延迟| D[注入 5s 延迟] I -->|中断| A[返回 503 错误] D --> S2[服务] A --> R4[错误响应] end

配置示例

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- fault:
delay:
percentage:
value: 10 # 10% 请求注入延迟
fixedDelay: 5s
abort:
percentage:
value: 5 # 5% 请求返回错误
httpStatus: 503
route:
- destination:
host: ratings

6.2 安全能力#

6.2.1 mTLS 双向认证#

sequenceDiagram participant A as 服务 A participant PA as Envoy A participant PB as Envoy B participant B as 服务 B Note over PA,PB: 控制平面已分发证书 A->>PA: 明文请求 PA->>PA: 添加证书 PA->>PB: mTLS 加密传输 PB->>PB: 验证证书 PB->>B: 明文请求 B-->>PB: 明文响应 PB->>PA: mTLS 加密传输 PA-->>A: 明文响应

mTLS 模式

模式说明
STRICT强制 mTLS,拒绝明文
PERMISSIVE同时接受 mTLS 和明文
DISABLE禁用 mTLS
# PeerAuthentication:配置 mTLS 策略
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
spec:
mtls:
mode: STRICT # 全局强制 mTLS

6.2.2 授权策略#

flowchart TB subgraph 授权检查 R[请求] --> C{身份验证} C -->|通过| A{授权检查} C -->|拒绝| D[401 Unauthorized] A -->|允许| S[服务] A -->|拒绝| F[403 Forbidden] end subgraph 授权条件 N[命名空间] S2[服务] M[HTTP 方法] P[路径] end A --> N A --> S2 A --> M A --> P

配置示例

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: httpbin
spec:
selector:
matchLabels:
app: httpbin
rules:
- from:
- source:
principals: ["cluster.local/ns/default/sa/frontend"]
to:
- operation:
methods: ["GET", "POST"]
paths: ["/api/*"]

6.3 可观测性#

6.3.1 三大支柱#

flowchart TB subgraph 可观测性三大支柱 M[Metrics<br/>指标] L[Logs<br/>日志] T[Traces<br/>追踪] end subgraph 用途 M --> M1[了解系统状态<br/>告警、趋势分析] L --> L1[问题诊断<br/>错误定位] T --> T1[性能分析<br/>调用链追踪] end subgraph 数据流 E[Envoy] -->|指标| P[Prometheus] E -->|日志| K[Kafka/ES] E -->|追踪| J[Jaeger/Zipkin] end

6.3.2 分布式追踪#

sequenceDiagram participant A as Frontend participant B as Product participant C as Reviews participant D as Ratings Note over A,D: Trace ID: abc123 A->>B: GET /products (Span 1) activate B B->>C: GET /reviews (Span 2) activate C C->>D: GET /ratings (Span 3) activate D D-->>C: 返回评分 deactivate D C-->>B: 返回评论 deactivate C B-->>A: 返回商品 deactivate B

Envoy 自动注入追踪头

x-request-id: 请求唯一标识
x-b3-traceid: 全局追踪 ID
x-b3-spanid: 当前 Span ID
x-b3-parentspanid: 父 Span ID
x-b3-sampled: 是否采样

6.3.3 指标体系#

flowchart LR subgraph 默认指标 R[请求成功率] L[请求延迟 P50/P99] T[吞吐量 RPS] S[服务拓扑] end subgraph Prometheus 查询 Q1[rate(istio_requests_total[5m])] Q2[histogram_quantile(0.99, ...)] Q3[sum by (destination_service)] end R --> Q1 L --> Q2 T --> Q1 S --> Q3

核心指标示例

# 服务成功率
sum(rate(istio_requests_total{response_code!~"5.*"}[5m]))
/ sum(rate(istio_requests_total[5m]))
# P99 延迟
histogram_quantile(0.99,
sum(rate(istio_request_duration_milliseconds_bucket[5m])) by (le)
)
# 服务间调用量
sum(rate(istio_requests_total[5m])) by (source_workload, destination_workload)

七、服务网格与传统框架对比#

7.1 架构对比#

flowchart TB subgraph 传统微服务框架 subgraph 服务实例 B[业务代码] SDK[SDK<br/>服务治理] end SDK -->|侵入式| B end subgraph 服务网格 subgraph 服务实例 B2[业务代码] end subgraph Sidecar P[Proxy] end B2 <-->|非侵入| P end Note1[SDK 升级需改业务代码] Note2[Sidecar 升级无感知]

7.2 功能对比#

功能Spring CloudDubboIstio
服务发现Eureka/ConsulNacos/ZookeeperKubernetes DNS
负载均衡Ribbon内置Envoy
熔断限流Hystrix/SentinelSentinelDestinationRule
配置管理ConfigNacosKubernetes ConfigMap
链路追踪Sleuth内置Envoy + Jaeger
服务网关Zuul/GatewayIngress Gateway
安全通信需自行实现需自行实现mTLS 内置
语言支持JavaJava语言无关
代码侵入
升级成本

7.3 适用场景对比#

flowchart TB subgraph 选择决策 Q1{技术栈是否统一?} Q1 -->|Java 技术栈| Q2{团队规模?} Q1 -->|多语言| M[服务网格] Q2 -->|小团队| S[Spring Cloud<br/>快速上手] Q2 -->|大团队| Q3{是否需要细粒度控制?} Q3 -->|是| M Q3 -->|否| S Q4{是否已有 Kubernetes?} Q4 -->|是| M Q4 -->|否| Q5{是否计划迁移?} Q5 -->|是| M Q5 -->|否| S end

7.4 成本对比#

维度传统框架服务网格
学习成本中等较高
部署复杂度
运行开销低(SDK 内存)高(Sidecar 内存)
运维成本中等
迁移成本
长期收益中等

八、服务网格的适用场景#

8.1 适合使用服务网格的场景#

mindmap root((适合服务网格)) 多语言微服务 Java、Go、Python 混合 统一服务治理 大规模集群 服务数量 > 50 调用关系复杂 Kubernetes 环境 已有容器化基础 需要云原生能力 安全要求高 需要 mTLS 加密 需要细粒度授权 可观测性需求 需要统一监控 需要链路追踪

典型场景

场景原因
多语言技术栈语言无关,统一治理
大规模微服务自动化服务治理,降低运维负担
金融/安全敏感系统内置 mTLS,零信任安全
混合云/多云架构统一的服务通信基础设施

8.2 不适合使用服务网格的场景#

flowchart TB subgraph 不推荐场景 S1[小规模服务<br/>< 10 个服务] S2[单语言技术栈<br/>Java 全栈] S3[无 Kubernetes 基础<br/>运维能力不足] S4[性能敏感应用<br/>延迟要求极高] end S1 --> R1[Spring Cloud/Dubbo<br/>更简单高效] S2 --> R1 S3 --> R1 S4 --> R2[考虑直连或优化配置]

8.3 服务网格的性能开销#

flowchart LR subgraph 延迟开销 N[直连] -->|+2-3ms| M[Sidecar 模式] end subgraph 内存开销 E[Envoy] -->|100-200MB| P[每个 Pod] end subgraph CPU 开销 E2[Envoy] -->|0.5-1 vCPU| P2[高负载场景] end

性能优化建议

优化方向方法
减少内存限制监听器数量,禁用不用的 Filter
降低延迟使用连接池,复用连接
减少 CPU降低采样率,减少指标维度
网络优化调整 TCP 参数,启用连接复用

九、服务网格的未来演进#

9.1 Ambient Mode#

Istio 1.18 引入的 Ambient Mode 简化了 Sidecar 部署:

flowchart TB subgraph Sidecar 模式 subgraph Pod A[应用容器] S[Sidecar 容器] end end subgraph Ambient 模式 subgraph Node P1[Pod 1<br/>仅应用] P2[Pod 2<br/>仅应用] ZT[ztunnel<br/>节点级代理] end P1 <--> ZT P2 <--> ZT end Note: Ambient 模式将代理下沉到节点级别

Ambient Mode 优势

  • 无需 Sidecar 注入
  • 资源开销更低
  • 应用完全无感知
  • 更适合大规模集群

9.2 与 Gateway API 的融合#

Kubernetes Gateway API 正在成为流量管理的标准:

flowchart LR subgraph Gateway API G[GatewayClass] GW[Gateway] HR[HTTPRoute] end subgraph Istio 集成 I[Istio] EG[Egress Gateway] IG[Ingress Gateway] end G --> I GW --> IG GW --> EG HR --> I

9.3 eBPF 与服务网格#

eBPF 技术为服务网格带来新的可能性:

flowchart TB subgraph 传统模式 K1[Kernel] -->|系统调用| U1[用户态 Envoy] U1 -->|系统调用| K1 end subgraph eBPF 模式 K2[Kernel] -->|eBPF 程序| S[Socket 层] S -->|绕过用户态| D[目的地] end Note: eBPF 在内核态处理,减少上下文切换

十、总结#

10.1 为什么需要服务网格?#

flowchart TB subgraph 核心原因 C1[微服务通信复杂] --> S1[需要统一治理] C2[多语言技术栈] --> S2[需要语言无关方案] C3[传统框架侵入] --> S3[需要非侵入式设计] C4[安全要求提高] --> S4[需要内置安全能力] C5[运维成本高] --> S5[需要自动化治理] end S1 --> R[服务网格] S2 --> R S3 --> R S4 --> R S5 --> R

10.2 服务网格的关键价值#

价值说明
语言无关任意语言应用统一治理
非侵入业务代码无需修改
统一治理流量、安全、可观测性一站式解决
声明式配置通过 CRD 统一管理策略
云原生集成与 Kubernetes 深度融合

10.3 选择建议#

场景建议
小规模单语言微服务Spring Cloud/Dubbo
大规模多语言微服务服务网格(Istio)
已有 Kubernetes 基础服务网格(Istio)
安全要求高的系统服务网格(Istio)
性能敏感的低延迟系统评估后谨慎选择

核心观点:服务网格是微服务治理的基础设施层,它通过 Sidecar 模式实现了服务治理与应用解耦,为大规模微服务集群提供了统一、高效、安全的通信治理能力。它不是微服务的必需品,但在合适的场景下,它能显著降低服务治理的复杂度。

参考引用#

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

为什么需要服务网格
https://blog.souloss.com/posts/why-the-design/why-service-mesh-is-needed/
作者
Souloss
发布于
2024-05-25
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时