服务网格是专门处理微服务间通信的基础设施层,采用 sidecar 模式将通信逻辑从业务代码中剥离,其中数据平面是负责实际处理服务间流量的核心组件集合,承担了流量转发、策略执行、 telemetry 采集等核心工作,是服务网格能力落地的直接执行者。

服务网格数据平面的核心定义
服务网格整体分为控制平面和数据平面两部分,控制平面负责下发配置、管理策略,而数据平面是运行在每个服务实例旁边或者与服务实例部署在同一网络命名空间的代理实例集合,所有服务间的出入流量都会经过对应的数据平面代理处理,业务服务本身不需要感知代理的存在。
数据平面的核心定位可以总结为三点:流量转发的中转站、策略执行的执行器、可观测数据的采集器,它将原本需要业务代码实现的重试、超时、熔断、链路追踪等通信治理能力下沉到基础设施层,让业务开发者可以专注于业务逻辑实现。
数据平面的核心功能
流量管控能力
数据平面可以根据控制平面下发的规则,对经过的流量进行精细化处理,常见能力包括:
- 请求路由:根据请求头、路径、权重等规则将流量转发到不同的服务版本,支持灰度发布、蓝绿部署等场景
- 流量治理:实现请求重试、超时控制、熔断、限流等能力,避免单个服务故障扩散到整个系统
- 负载均衡:支持轮询、随机、最少连接、一致性哈希等多种负载均衡算法,合理分配流量到后端服务实例
安全能力
数据平面负责执行控制平面下发的服务间安全策略,主要包括:
- 双向TLS认证:自动为服务间通信签发证书,实现通信双方的身份校验,避免流量被窃听或篡改
- 访问授权:根据配置的规则校验请求方是否有权限访问目标服务,实现细粒度的权限控制
可观测性能力
数据平面会在处理流量的过程中自动采集相关的 telemetry 数据,不需要业务代码额外埋点:
- 指标数据:采集请求量、成功率、延迟、错误率等核心指标,上报到监控系统
- 分布式追踪:为每个请求生成唯一的 trace ID,记录请求经过的所有服务节点,支持全链路追踪
- 访问日志:记录每个请求的详细信息,包括来源、目标、请求路径、状态码、延迟等,方便问题排查
数据平面的常见实现方案
目前行业内主流的服务网格数据平面实现基本都基于 Envoy 代理,Envoy 是Lyft开源的高性能C++代理,天生为服务网格场景设计,具备以下核心特性:
- 支持动态配置更新,不需要重启代理即可生效新的策略规则
- 支持多种协议,包括HTTP/1.1、HTTP/2、gRPC、TCP等,适配大部分微服务通信场景
- 具备完善的流量管控、安全、可观测能力,生态成熟,兼容性好
除了Envoy之外,也有部分服务网格采用其他代理作为数据平面,比如Linkerd 2.x使用的基于Rust开发的Linkerd2-proxy,相比Envoy更加轻量,资源占用更低,适合资源受限的场景。
数据平面工作流程示例
我们以典型的sidecar部署模式为例,说明数据平面的实际工作流程:假设服务A需要调用服务B的接口,整个流程如下:
- 服务A的业务代码发起对服务B的请求,请求目标为服务B的服务名
- 服务A的 sidecar 代理拦截该请求,根据控制平面下发的服务发现规则,找到服务B的可用实例列表
- 服务A的 sidecar 代理根据配置的负载均衡策略,选择一个服务B的实例,同时将请求转发给该实例对应的 sidecar 代理
- 服务B的 sidecar 代理接收到请求后,校验请求的合法性,包括TLS认证、访问权限等,校验通过后转发给服务B的业务进程
- 服务B处理完请求后,响应经过服务B的 sidecar 代理,再转发回服务A的 sidecar 代理,最终返回给服务A的业务代码
- 整个流程中,两个 sidecar 代理会自动采集请求的相关指标、生成追踪信息、记录访问日志,上报到对应的后端系统
简单配置示例
以下是一个简化的Envoy数据平面配置示例,展示了基本的监听器、集群、路由配置:
{
"listeners": [
{
"name": "service_a_listener",
"address": {
"socket_address": {
"address": "0.0.0.0",
"port_value": 8080
}
},
"filter_chains": [
{
"filters": [
{
"name": "envoy.filters.network.http_connection_manager",
"typed_config": {
"@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager",
"stat_prefix": "ingress_http",
"route_config": {
"name": "local_route",
"virtual_hosts": [
{
"name": "service_b",
"domains": ["*"],
"routes": [
{
"match": {
"prefix": "/api"
},
"route": {
"cluster": "service_b_cluster"
}
}
]
}
]
},
"http_filters": [
{
"name": "envoy.filters.http.router"
}
]
}
}
]
}
]
}
],
"clusters": [
{
"name": "service_b_cluster",
"connect_timeout": "5s",
"type": "STRICT_DNS",
"lb_policy": "ROUND_ROBIN",
"load_assignment": {
"cluster_name": "service_b_cluster",
"endpoints": [
{
"lb_endpoints": [
{
"endpoint": {
"address": {
"socket_address": {
"address": "service-b-sidecar",
"port_value": 8080
}
}
}
}
]
}
]
}
}
]
}
上述配置定义了服务A的 sidecar 代理监听8080端口,将所有路径前缀为/api的请求转发到名为service_b_cluster的集群,集群采用轮询的负载均衡策略,请求会转发到服务B的 sidecar 代理地址。
数据平面与控制平面的关系
数据平面和控制平面是服务网格不可分割的两部分,二者分工明确:
- 控制平面负责抽象管理规则,比如定义路由策略、安全策略、服务发现信息,将这些规则转换成数据平面能够理解的配置格式,下发给所有数据平面实例
- 数据平面只负责执行配置,不需要做决策,所有策略的变更都由控制平面统一处理,再同步到数据平面,保证整个集群的策略一致性
这种分离架构让服务网格的管理更加集中高效,同时数据平面的无状态特性也保证了整体的可扩展性和高可用性,单个数据平面实例故障不会影响其他服务的通信。
service_meshdata_planeenvoysidecar修改时间:2026-06-16 22:12:19