2. Envoy 限流架构总览:全局限流与本地限流架构、限流过滤器链、限流服务组件关系
在微服务网关与 Sidecar 代理中,Envoy 提供了两种核心的限流模式:本地限流(Local Rate Limiting)与全局限流(Global Rate Limiting)。理解这两种模式的架构差异、过滤器链编排方式以及限流服务组件的协作关系,是掌握 Envoy 限流工程应用的基础。
2.1 全局限流 vs. 本地限流:架构对比
| 对比维度 | 全局限流(Global RL) | 本地限流(Local RL) |
|---|---|---|
| 决策中心 | 外部独立的限流服务(Rate Limit Service) | Envoy 代理进程内部 |
| 数据一致性 | 强一致(依赖 Redis/etcd 等集中存储) | 弱一致(每个 Envoy 实例独立计数) |
| 延迟开销 | 高(每次请求需 RPC 调用限流服务) | 低(纯内存操作,无网络开销) |
| 适用场景 | 全局配额、跨集群共享限流、用户级限流 | 单机削峰、过载保护、冷启动预热 |
| 配置复杂度 | 高(需部署限流服务 + 配置描述符) | 低(仅需 Envoy 配置) |
| 冷启动削峰适配度 | 中等(依赖外部组件响应速度) | 高(本地决策,响应迅速) |
工程建议:在冷启动削峰场景中,优先采用本地限流作为第一道防线,利用其低延迟特性快速抑制突发流量;全局限流可作为全局兜底策略,用于跨集群的配额管控。
2.2 限流过滤器链:请求处理路径
Envoy 的限流能力通过 HTTP 过滤器(HTTP Filter)链实现。在 HTTP 连接管理器中,限流过滤器按照特定顺序插入,形成一条处理流水线:
- Router Filter(路由过滤器) — 确定请求的目标集群。
- Rate Limit Filter(限流过滤器) — 根据路由配置触发限流检查。
- Fault Filter(故障注入过滤器) — 可选,用于测试。
- Upstream Codec(上游编解码) — 转发请求到上游服务。
限流过滤器本身支持两种操作模式:
- 全局限流模式:将限流描述符(Descriptor)通过 gRPC 发送给外部限流服务,等待决策。
- 本地限流模式:在 Envoy 进程内使用令牌桶算法直接判断,不依赖外部服务。
关键配置片段:本地限流过滤器配置示例
http_filters:
- name: envoy.filters.http.local_ratelimit
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit
stat_prefix: http_local_rate_limiter
_bucket:
max_tokens: 100
tokens_per_fill: 10
fill_interval: 1s
filter_enabled:
runtime_key: local_rate_limit_enabled
default_value:
numerator: 100
denominator: HUNDRED
filter_enforced:
runtime_key: local_rate_limit_enforced
default_value:
numerator: 100
denominator: HUNDRED
response_headers_to_add:
- header:
key: "X-Local-Rate-Limit"
value: "true"
2.3 限流服务组件关系:全局限流架构
全局限流架构涉及多个组件的协作,其核心交互流程如下图所示:
2.4 本地限流架构:进程内决策
本地限流架构更为简洁,所有限流逻辑在 Envoy 进程内部完成,无需外部依赖:
2.5 限流服务组件关系总结
Envoy 限流架构中的核心组件及其职责可归纳如下:
| 组件 | 角色 | 关键接口/协议 | 冷启动削峰中的作用 |
|---|---|---|---|
| Envoy HTTP 连接管理器 | 请求入口,管理过滤器链 | HTTP/1.1, HTTP/2, gRPC | 承载限流过滤器,控制请求处理流程 |
| 限流过滤器(HTTP Filter) | 执行限流检查逻辑 | envoy.filters.http.local_ratelimit / envoy.filters.http.ratelimit | 根据配置决定是否放行或拒绝请求 |
| 限流服务(RLS) | 全局限流决策引擎 | envoy.service.ratelimit.v3.RateLimitService | 提供全局配额查询,适用于跨集群场景 |
| 令牌桶( Bucket) | 本地限流核心算法 | max_tokens, tokens_per_fill, fill_interval | 控制突发流量,实现平滑限流 |
| 限流描述符(Descriptor) | 定义限流规则的匹配条件 | key-value 对,支持通配符 | 精细化控制不同维度的限流策略 |
架构选型提醒:在冷启动削峰场景中,如果采用全局限流,务必关注限流服务的响应延迟和可用性。限流服务本身的故障可能导致整个集群的限流能力丧失。建议采用本地限流为主、全局限流为辅的混合架构,并通过
filter_enabled 和 filter_enforced 运行时参数动态调整限流生效比例。