3. Envoy 代理基础:Envoy 架构、Listener、Cluster、Endpoint、Filter 链
Envoy 是服务网格数据平面的核心组件,其架构设计直接决定了代理链路的建立效率与首次请求延迟。本章深入剖析 Envoy 的四大核心抽象——Listener、Cluster、Endpoint 与 Filter 链,并揭示它们在代理链路建立过程中的协作机制。
3.1 Envoy 整体架构概览
Envoy 采用现代 C++ 异步事件驱动模型,基于 libevent 和多线程 Worker 架构实现高吞吐与低延迟。其核心设计原则是:将网络流量处理拆解为可组合的抽象层,每一层负责特定的协议转换、路由或过滤逻辑。
3.2 Listener:流量入口与连接生命周期管理
Listener 是 Envoy 接收外部流量的第一道关卡。每个 Listener 绑定一个 IP:Port,负责监听、接受连接,并将连接分发给对应的 Worker 线程。
| Listener 配置属性 | 作用 | 对首次请求延迟的影响 |
|---|---|---|
address |
绑定的 IP 与端口 | 端口冲突或绑定失败直接导致服务不可用 |
filter_chains |
连接级 Filter 链定义 | Filter 数量与复杂度增加握手延迟 |
listener_filters |
连接接受前的预处理(如 TLS 检测) | 错误配置可能导致连接被提前丢弃 |
connection_balance_config |
连接在 Worker 间的分发策略 | 不均衡分发导致部分 Worker 过载 |
per_connection_buffer_limit_bytes |
每个连接的读写缓冲区大小 | 过小缓冲区增加系统调用次数 |
3.3 Cluster 与 Endpoint:上游服务抽象与负载均衡
Cluster 定义了一组提供相同服务的上游主机集合,而 Endpoint 则是这些主机的具体网络地址。Envoy 通过 Cluster 实现连接池管理、负载均衡与健康检查。
3.3.1 Cluster 的核心配置项
- 连接池 (Connection Pool):复用上游连接,减少 TCP 握手开销。首次请求时连接池为空,必须新建连接,这是首次请求延迟的主要来源之一。
- 负载均衡策略:支持 Round Robin、Least Request、Ring Hash、Maglev 等。策略选择影响请求分发效率。
- 健康检查 (Health Check):主动探测 Endpoint 可用性,剔除异常节点。首次请求可能命中正在启动的 Endpoint,导致连接超时。
- 端点发现 (EDS):通过 xDS 动态获取 Endpoint 列表。首次请求时若 EDS 尚未完成,请求将被阻塞。
3.3.2 Endpoint 的延迟敏感属性
| 属性 | 说明 | 首次请求延迟关联 |
|---|---|---|
address |
上游主机 IP:Port | DNS 解析延迟(若使用 DNS 类型) |
health_status |
健康状态(健康/异常/驱逐) | 异常 Endpoint 导致连接失败与重试 |
load_balancing_weight |
负载均衡权重 | 权重过低导致请求被分配到冷 Endpoint |
metadata |
自定义元数据(如版本、区域) | 影响路由决策与 locality 感知 |
3.4 Filter 链:请求处理管道的构建与执行
Filter 链是 Envoy 实现协议处理与流量治理的核心机制。每个连接或请求经过一系列 Filter 的串联处理,完成协议解析、路由决策、限流、日志记录等操作。
3.4.1 Filter 的分类与执行顺序
| Filter 类型 | 作用层级 | 典型 Filter 示例 | 延迟影响 |
|---|---|---|---|
| Listener Filter | 连接接受前 | TLS Inspector、Original Destination | 增加连接建立前的检测开销 |
| Network Filter | 连接级 | TCP Proxy、Rate Limit、RBAC | 每个连接执行一次,影响连接建立延迟 |
| HTTP Filter | 请求/响应级 | Router、CORS、Fault Injection、gRPC-Web | 每个请求执行,直接影响请求延迟 |
3.4.2 HTTP Filter 链的执行流程
当 Envoy 收到一个 HTTP 请求时,Filter 链按配置顺序依次执行。每个 Filter 可以读取、修改或终止请求。Router Filter 是链中最后一个核心 Filter,负责将请求路由到目标 Cluster。
# 典型的 HTTP Filter 链配置片段
http_filters:
- name: envoy.filters.http.fault # 故障注入 Filter(用于测试)
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.fault.v3.Fault
abort:
http_status: 503
percentage:
numerator: 0 # 生产环境关闭
- name: envoy.filters.http.router # 路由 Filter(必须位于最后)
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
3.5 代理链路建立的完整时序
理解 Envoy 代理链路建立的完整过程,是诊断首次请求延迟的基础。以下时序展示了从客户端请求到达 Envoy 到请求被转发至上游 Endpoint 的完整链路。
- Listener 接受连接:Worker 线程上的 Event Loop 检测到新连接,调用 Listener 的 accept 回调。
- Listener Filter 执行:执行 TLS Inspector 等预检测 Filter,确定连接协议类型。
- Network Filter 链执行:执行连接级 Filter,如 TCP Proxy 或 Rate Limit。
- HTTP 协议解析:Envoy 内置的 HTTP 编解码器解析请求行、Header 和 Body。
- HTTP Filter 链执行:依次执行 CORS、Fault Injection、Router 等 Filter。
- 路由决策:Router Filter 根据请求的 Host、Path 等匹配 Cluster 路由规则。
- 连接池获取/创建连接:检查 Cluster 连接池中是否有可用连接;若无,则新建 TCP 连接。
- 负载均衡选端点:根据负载均衡策略从健康 Endpoint 中选中一个目标。
- 上游连接建立:执行 TCP 握手、TLS 协商(若启用),发送 HTTP 请求。
- 响应返回:上游响应经过 Filter 链反向传递,最终返回客户端。
Envoy 的架构设计通过异步非阻塞 I/O 和多 Worker 线程实现了高并发处理能力,但首次请求的“冷启动”问题需要开发者从 Listener 预热、连接池预创建、Filter 链精简等角度进行针对性优化。后续章节将深入这些优化策略的具体实现。