4. Envoy 架构概览:线程模型、Listener、Cluster 与 Filter 链
Envoy 作为高性能服务网格数据面代理,其架构设计围绕非阻塞事件驱动与多级可扩展展开。理解线程模型、Listener、Cluster 及 Filter 链是掌握限流削峰机制的基础。本节从核心抽象出发,逐步拆解 Envoy 的内部运行骨架。
4.1 线程模型:主线程 + Worker 线程
Envoy 采用单进程多线程架构,避免多进程带来的共享内存开销,同时利用现代 CPU 多核能力。线程模型分为三类角色:
| 线程角色 | 数量 | 职责 |
|---|---|---|
| Main 线程 | 1 | 配置加载/热重启、DNS 解析、Cluster 管理、统计刷新、Admin 接口 |
| Worker 线程 | 通常 = CPU 核数 | 监听套接字、连接接受、Filter 链处理、转发、连接池管理 |
| 文件刷新线程 | 1(可选) | 异步文件日志写入、访问日志落盘 |
关键设计:每个 Worker 线程持有独立的连接池与事件循环,无锁竞争。连接在建立时通过
SO_REUSEPORT 或内核分发绑定到固定 Worker,后续所有事件都在该 Worker 内处理,避免跨线程锁。
4.2 Listener:流量入口抽象
Listener 定义了 Envoy 如何暴露端口并接收入站流量。每个 Listener 绑定一个 IP:Port,并可配置 TLS 终止、代理协议、连接限制等。核心属性包括:
- 地址:监听的具体 IP 与端口(如
0.0.0.0:8080)。 - Filter 链:入站流量经过的过滤器列表(L3/L4/L7)。
- 连接限制:全局或每 Worker 的最大并发连接数,是连接级限流的第一道防线。
- Socket 选项:
SO_REUSEPORT、TCP_FASTOPEN等内核调优参数。
冷启动削峰关联:在服务目录冷启动阶段,大量客户端重试连接涌入时,Listener 级别的
max_connections 可防止 Envoy 自身因文件描述符耗尽而崩溃。
4.3 Cluster:上游服务端点抽象
Cluster 代表 Envoy 将流量转发到的上游服务组。它封装了端点发现、负载均衡、健康检查、连接池等能力。Cluster 类型包括:
| 类型 | 端点来源 | 典型场景 |
|---|---|---|
STATIC |
静态配置 | 固定后端、测试环境 |
STRICT_DNS |
DNS 解析 | Kubernetes Headless Service |
LOGICAL_DNS |
DNS 解析(单端点) | 外部服务、CDN 回源 |
EDS |
控制面 xDS | Istio 服务网格、动态服务发现 |
Cluster 内部维护连接池(HTTP/1.1 连接池、HTTP/2 多路复用池),每个 Worker 线程拥有独立连接池实例。连接池大小、超时、重试策略直接影响冷启动时的连接建立风暴。
4.4 Filter 链:可插拔处理管道
Filter 是 Envoy 扩展性的核心。流量在 Listener 与 Cluster 之间经过多层 Filter 链处理,每一层都可以读取、修改、终止或转发请求。Filter 按层级分为:
- Listener Filter:在连接建立阶段执行,如 TLS 握手、代理协议解析、连接限流。
- Network Filter (L3/L4):在原始字节流层面处理,如 TCP 代理、MongoDB 嗅探、本地限流。
- HTTP Filter (L7):在 HTTP 请求/响应层面处理,如 Router、CORS、全局限流、本地限流。
限流 Filter 位置选择:连接级限流应放在 Listener Filter 或 Network Filter 中,请求级限流应放在 HTTP Filter 中。错误放置会导致限流粒度不匹配或性能浪费。
4.5 核心架构关系图
下图展示了 Envoy 内部 Main 线程、Worker 线程、Listener、Filter 链与 Cluster 之间的数据流关系:
4.6 限流在架构中的位置
基于上述架构,Envoy 的限流能力分布在三个层级,形成分层防御:
| 层级 | Filter 位置 | 限流粒度 | 典型实现 |
|---|---|---|---|
| 连接级 | Listener Filter | 每连接 | envoy.filters.listener.connection_limit |
| 网络级 | Network Filter | 每连接字节/包 | envoy.filters.network.local_ratelimit |
| HTTP 级 | HTTP Filter | 每请求 | envoy.filters.http.local_ratelimit / 全局限流 |
冷启动削峰最佳实践:在服务目录冷启动阶段,建议同时启用Listener Filter 连接限流(防止连接风暴压垮 Envoy)和HTTP Filter 本地限流(防止请求洪峰冲垮刚注册的上游实例)。两个层级独立配置,互不干扰。
4.7 本章小结
- Envoy 的线程模型通过 Main + Worker 实现无锁并发,Worker 线程独立处理连接与请求。
- Listener 是流量入口,支持连接级限流与 Filter 链挂载。
- Cluster 是上游端点抽象,管理连接池与负载均衡,直接影响冷启动时的连接建立行为。
- Filter 链提供可插拔处理管道,限流 Filter 可部署在 Listener、Network、HTTP 三个层级。
- 理解这些核心概念是后续配置本地限流与全局限流的前提。