微服务多了,通信为什么难管
当服务从几个涨到几十上百个,每个服务都要做服务发现、重试、限流、熔断、加密、灰度发布、调用统计。如果把这些逻辑写进每个业务的 SDK,升级一次要改所有服务、换语言就要重写一遍。服务网格的思路是把这些通信治理能力从业务代码里抽出来,变成一层独立的基础设施,业务只管写业务逻辑。
- Sidecar和业务同部署的代理,接管所有出入流量。
- 数据面实际转发流量的代理集合。
- 控制面下发规则、管理证书的中枢。
- Istio最主流的服务网格实现之一。
数据面与控制面:两层架构
服务网格分两层。数据面是一堆和业务进程一起跑的代理(Sidecar),所有进出服务的网络请求都先经过它。控制面是一个中心化的组件,把路由规则、限流策略、证书下发到每个代理。业务无感知地享受治理能力,规则改了只在控制面操作,不用动业务代码。
Envoy 代理到底做了什么
Istio 数据面默认用 Envoy。它是一个高性能的边缘代理,能做负载均衡、健康检查、限流、熔断、协议转换,还把每次调用的指标吐出来。Sidecar 模式下,Envoy 以旁路方式插在服务旁边,服务把请求发给本地 Envoy,由它转发给目标服务的本地 Envoy,再交给目标服务。
# 简化理解:服务 A 调用服务 B 的实际路径
A --> 本地 Envoy(A) --> 网络 --> 本地 Envoy(B) --> B
# 重试、熔断、灰度、加密都在这条链路上自动完成
Istio 的流量治理能力
用 Istio 配置一个虚拟服务,就能做按版本灰度:把 90% 流量给稳定版本、10% 给新版本,出问题一键切回。还能做故障注入(故意延迟测试容错)、流量镜像(把线上流量复制一份发到新版本验证)。这些都不用改代码,改 YAML 规则即可。
安全:mTLS 与授权
服务之间默认明文调用是很大的风险。Istio 自动给服务之间的通信启用双向 TLS(mTLS),代理之间自动签发和轮换证书,业务完全不用碰证书。再配合授权策略,可以精细控制哪个服务允许调用哪个服务的哪个接口。
可观测性:指标、日志、追踪
因为所有流量都经过 Envoy,网格天然知道每个服务调用的成功率、延迟、拓扑。开启后自动生成调用链指标和分布式追踪,不用业务埋点就能看到服务依赖图和慢调用在哪。这是 SDK 方案很难做到的统一可观测。
和 SDK、网关方案怎么选
不是所有团队都需要服务网格。服务少、语言单一、规模小,用 SDK(如 Spring Cloud)或一个 API 网关就够了。当服务数量多、多语言、需要统一灰度和 mTLS、想要零侵入可观测时,服务网格的收益才盖过它引入的运维复杂度和额外延迟。
落地清单
- 先想清楚规模和痛点,别为了用而用。
- 理解数据面与控制面职责,Sidecar 是旁路代理。
- 灰度、mTLS、可观测是三大核心收益。
- 小范围试点一个业务,验证延迟与运维成本。
- 规则用代码管理,别在控制面手工散落配置。