Envoy 中的 Filter 是一种可插拔的组件,用于处理进出代理的流量。过滤器可以在不同的层次上工作,包括网络层(L3/L4)和 HTTP 层。
过滤器的类型
Envoy 提供了多种类型的过滤器,主要可以分为以下几类:
- 监听器过滤器(Listener Filters):这些过滤器在网络层级上操作,处理传入的连接请求,如 TLS 握手或协议检测。
- 网络过滤器(Network Filters):网络过滤器直接操作 TCP 流量,负责处理所有通过特定监听器的数据。典型的网络过滤器包括 TCP 代理、HTTP 连接管理器等。
- HTTP 过滤器(HTTP Filters):这些过滤器专门用于处理 HTTP 流量,可以操作 HTTP 请求和响应。它们在 HTTP 连接管理器的上下文中运行,例如实现路由、身份验证和授权等功能。
- 自定义过滤器(Custom Filters):Envoy 也支持自定义过滤器开发,允许开发者根据特定需求创建过滤器。
过滤器的工作流程
在 Envoy 中,过滤器以管道的形式组织,请求和响应数据会依次流经每个过滤器。每个过滤器可以对数据进行处理,并决定是否将数据传递给链中的下一个过滤器。这种设计允许灵活地添加、修改或删除任何处理步骤,而不会影响其他组件。
网络过滤器 (Network Filters)
网络过滤器在 Listener 级别工作,用于处理原始字节流。它们在 Listener 接收到新连接时被实例化。常见的网络过滤器包括:
- TLS 终止:处理 TLS 握手并终止 TLS 连接。
- Redis 代理:实现 Redis 协议的代理逻辑。
- MongoDB 代理:实现 MongoDB 协议的代理逻辑。
- DynamoDB 代理:实现 DynamoDB 协议的代理逻辑。
网络过滤器按照配置的顺序组成一个过滤器链,依次处理进出的流量。
HTTP 过滤器 (HTTP Filters)
HTTP 过滤器在 HTTP 连接管理器级别工作,用于处理 HTTP 请求和响应。它们在 HTTP 连接管理器接收到新的 HTTP 请求时被实例化。常见的 HTTP 过滤器包括:
- 路由:实现请求路由逻辑,将请求转发到合适的上游集群。
- 速率限制:对请求速率进行限制。
- 缓冲:为请求和响应实现缓冲。
- CORS:实现 CORS 策略。
- Gzip:对响应进行 Gzip 压缩。
HTTP 过滤器也是按照配置的顺序组成一个过滤器链,依次处理 HTTP 请求和响应。
Listener 过滤器 (Listener Filters)
Listener 过滤器在 Listener 接收到新连接时被实例化,用于收集连接信息,为后续的网络过滤器链选择做准备。例如,Listener 过滤器可以收集 TLS 握手数据,包括 SNI 和 ALPN,以选择合适的网络过滤器链。
如何配置 Envoy 过滤器?
配置 Envoy 过滤器通常涉及定义 YAML 或 JSON 配置文件。下面是一个配置 HTTP 过滤器的简单示例:
static_resources:
listeners:
- name: listener_0
address:
socket_address: { address: 0.0.0.0, port_value: 80 }
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
codec_type: AUTO
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match: { prefix: "/" }
route: { cluster: service_cluster }
http_filters:
- name: envoy.filters.http.router
在这个配置中,我们设置了一个 HTTP 连接管理器作为网络过滤器,它使用了 HTTP 路由过滤器来管理请求的路由。