2. Envoy 核心组件:Listener、Filter、Cluster、Endpoint、Router 的工作原理
Envoy 的架构围绕五个核心抽象构建:Listener(监听器)、Filter(过滤器)、Cluster(集群)、Endpoint(端点)和 Router(路由器)。理解这五个组件及其协作关系,是掌握 Envoy 流量处理模型的基础。本章将逐一拆解每个组件的工作原理,并通过数据流图展示它们如何串联成完整的请求处理链路。
2.1 组件总览与职责划分
Envoy 采用 L4/L7 分层处理 架构。Listener 负责网络接入,Filter 链负责协议解析与策略执行,Router 负责流量分发决策,Cluster 与 Endpoint 负责后端服务抽象与负载均衡。下表总结了每个组件的核心职责与工作层级:
| 组件 | 工作层级 | 核心职责 | 关键配置项 |
|---|---|---|---|
| Listener | L4 (TCP/UDP) | 绑定端口、接受连接、管理 TLS 终止 | address, filter_chains, listener_filters |
| Filter | L4 / L7 | 解析协议、执行策略、生成日志与指标 | typed_config, name, filter_class |
| Router | L7 (HTTP) | 匹配请求、选择路由、执行重试/超时 | route_config, virtual_hosts, routes |
| Cluster | L4 / L7 | 定义后端服务组、配置负载均衡策略 | type (EDS/STRICT_DNS/STATIC), lb_policy |
| Endpoint | L4 | 表示单个后端实例(IP:Port) | address, health_status, metadata |
2.2 Listener:网络接入的起点
Listener 是 Envoy 对外暴露服务的网络入口。每个 Listener 绑定一个或多个 IP:Port,负责接收来自客户端的 TCP 连接或 UDP 数据报。Envoy 支持 单 Listener 多 Filter Chain 模式,即同一个端口可以根据 TLS SNI 或源 IP 选择不同的过滤器链。
- 绑定与接受: Listener 使用
SO_REUSEPORT实现多 worker 线程的独立 accept,提升并发性能。 - TLS 终止: 在 Listener 层可配置
filter_chains中的transport_socket,实现 TLS 卸载。 - Listener Filter: 在连接建立后、L4 Filter 之前执行的轻量级过滤器,常用于 TLS 检测、代理协议解析。
- 动态更新: 通过 LDS (Listener Discovery Service) 实现运行时 Listener 的增删改,无需重启。
2.3 Filter:可插拔的处理管道
Filter 是 Envoy 实现协议处理与策略注入的核心机制。Envoy 将 Filter 组织成 链式结构,按顺序依次执行。Filter 分为三类:
| Filter 类型 | 工作层级 | 典型用途 | 示例 |
|---|---|---|---|
| Listener Filter | L4 (连接前) | TLS 检测、代理协议解析、源 IP 识别 | envoy.filters.listener.tls_inspector |
| Network Filter (L4) | L4 (连接中) | TCP 代理、速率限制、原始数据记录 | envoy.filters.network.tcp_proxy |
| HTTP Filter (L7) | L7 (请求/响应) | 路由、限流、故障注入、日志、RBAC | envoy.filters.http.router, envoy.filters.http.local_ratelimit |
HTTP Filter 链的执行顺序至关重要:Decoder Filter(请求方向)先执行,Encoder Filter(响应方向)后执行。Router Filter 通常位于 Decoder 链的末尾,负责将请求转发给 Cluster。
2.4 Cluster 与 Endpoint:后端服务抽象
Cluster 定义了一组提供相同服务的后端实例集合,Endpoint 则是这些实例的具体网络地址。Envoy 通过 EDS (Endpoint Discovery Service) 或静态配置管理 Endpoint 的生命周期。
- Cluster 类型:
- STATIC: 静态配置,适用于固定后端。
- STRICT_DNS: 通过 DNS 解析获取 IP 列表,适用于 DNS 轮询场景。
- LOGICAL_DNS: 只解析一次,适用于长连接场景。
- EDS: 通过 xDS 动态下发,适用于大规模服务网格。
- 负载均衡策略: 支持 ROUND_ROBIN、LEAST_REQUEST、RING_HASH、MAGLEV 等。
- 健康检查: Envoy 主动对 Endpoint 发起 HTTP/TCP 健康检查,不健康的 Endpoint 会被移出负载均衡池。
- 端点权重: 每个 Endpoint 可配置权重,用于灰度发布或流量分配。
cluster.upstream_rq_xx 系列指标(如 2xx、5xx)和 cluster.membership_healthy,可以快速判断后端集群的健康状态与负载均衡效果。
2.5 Router:流量分发决策引擎
Router 是 Envoy L7 路由的核心组件,通常以 HTTP Filter 的形式存在(envoy.filters.http.router)。它根据 路由配置(RouteConfiguration) 匹配请求,并决定将请求转发到哪个 Cluster。
路由匹配规则支持多层条件:
| 匹配维度 | 配置字段 | 示例 |
|---|---|---|
| 请求路径 | match.path / match.safe_regex |
/api/v1/* |
| 请求头 | match.headers |
host: example.com |
| 查询参数 | match.query_parameters |
version=v2 |
| HTTP 方法 | match.headers (结合 :method) |
GET / POST |
| 动态元数据 | match.metadata |
用于金丝雀发布 |
Router 还负责执行 重试策略、超时控制、流量镜像 和 故障注入 等高级功能。
2.6 组件协作数据流
下图展示了从客户端请求到后端响应的完整数据流,清晰呈现 Listener、Filter、Router、Cluster、Endpoint 的协作关系:
2.7 组件配置示例
以下是一个简化的 Envoy 配置片段,展示了 Listener、Filter、Router、Cluster、Endpoint 的声明方式:
static_resources:
listeners:
- name: listener_http
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: backend
domains: ["*"]
routes:
- match: { prefix: "/api" }
route: { cluster: service_api }
http_filters:
- name: envoy.filters.http.router
clusters:
- name: service_api
connect_timeout: 0.25s
type: EDS
lb_policy: LEAST_REQUEST
eds_cluster_config:
eds_config:
resource_api_version: V3
http_filters 中 Router Filter 位于列表末尾;Cluster 的 type: EDS 表示端点由控制面动态下发,适用于 Istio 等服务网格场景。
2.8 组件故障排查要点
当流量处理出现异常时,可以按以下组件维度进行排查:
| 组件 | 常见故障现象 | 排查命令 / 指标 |
|---|---|---|
| Listener | 连接超时、端口冲突 | curl -s http://localhost:15000/listeners 查看 Listener 状态 |
| Filter | 请求被错误拦截、日志缺失 | 检查 Filter 顺序与 typed_config 参数 |
| Router | 请求 404、路由到错误 Cluster | curl -s http://localhost:15000/config_dump 查看路由配置 |
| Cluster | 后端不可达、负载不均 | curl -s http://localhost:15000/clusters 查看集群健康状态 |
| Endpoint | 端点被标记为不健康、权重异常 | 检查 EDS 响应与健康检查日志 |
type 与 Endpoint 的发现方式。例如,type: STRICT_DNS 的 Cluster 仍然可以通过 EDS 覆盖端点,但 DNS 解析结果会优先被 EDS 替换。理解这一优先级关系对排查端点发现问题至关重要。