找回密码
 立即注册
首页 业界区 业界 不止是代理:Envoy 在微服务中的熔断、限流与流量治理实 ...

不止是代理:Envoy 在微服务中的熔断、限流与流量治理实战

格恳绌 2026-1-14 02:20:03
前言

之前的小节,已经详细介绍了envoy做反向代理、服务发现、流量劫持以及自动注入envoy的sidecar,可以发现envoy不光是一个普通的http代理工具,它还有很多非常强大的功能,本小节就来介绍一下envoy其他强大且实用的功能
Envoy 核心流量治理能力实践:熔断、限流、流量分发、透明代理
熔断

在分布式系统中,最危险的不是错误,而是慢。当某个下游服务变慢时:

  • 上游请求不断堆积
  • 线程、连接被耗尽
  • 最终引发级联故障(雪崩)
Envoy 的熔断机制,目的非常明确:在下游资源耗尽之前,主动拒绝请求,保护系统整体稳定
Envoy 的熔断配置

Envoy 的熔断是基于资源使用情况的硬限制,而不是基于错误率的统计判断。
核心限制指标包括:

  • 最大连接数
  • 最大并发请求数
  • 最大等待请求数
  • 最大重试请求数
  1.   clusters:
  2.     - name: app_service
  3.       ...
  4.       circuit_breakers:
  5.         thresholds:
  6.         - priority: DEFAULT
  7.           max_connections: 1000
  8.           max_pending_requests: 100
  9.           max_requests: 5
  10.           max_retries: 50
复制代码
当任意指标超过阈值,Envoy 直接返回 503,请求不会进入上游
验证

为了验证是否生效,先将max_requests改为5,只要并发超过5,就会立刻报错。用ab来测试一下
  1. ab -n 10 -c 10 10.22.12.178:30785/test
复制代码
1.png

确实出现了4次报错,在查看envoy的access_log,也能对上
  1. [2025-12-30T08:03:41.267Z] "GET /test HTTP/1.0" 200 40 0 aecc99c3-4649-478e-8610-79e1b86c6338 "ApacheBench/2.3" "-" 10.244.0.203:10000 app_service -
  2. [2025-12-30T08:03:41.270Z] "GET /test HTTP/1.0" 503 81 0 98609f61-60cf-4522-96c6-e0eb51743791 "ApacheBench/2.3" "-" 10.244.0.203:10000 app_service UO
  3. [2025-12-30T08:03:41.270Z] "GET /test HTTP/1.0" 503 81 0 0b244330-25bd-48e9-b9fc-a0b7f5846e17 "ApacheBench/2.3" "-" 10.244.0.203:10000 app_service UO
  4. [2025-12-30T08:03:41.270Z] "GET /test HTTP/1.0" 503 81 0 09906490-1916-4e26-bc9f-85d830e1f219 "ApacheBench/2.3" "-" 10.244.0.203:10000 app_service UO
  5. [2025-12-30T08:03:41.271Z] "GET /test HTTP/1.0" 503 81 0 a77bc60a-5cdc-4340-8969-9ce2a1b6206d "ApacheBench/2.3" "-" 10.244.0.203:10000 app_service UO
  6. [2025-12-30T08:03:41.270Z] "GET /test HTTP/1.0" 200 40 2 550dc619-6002-4bd6-9b36-3fe1a2b2b3e3 "ApacheBench/2.3" "-" 10.244.0.203:10000 app_service -
  7. [2025-12-30T08:03:41.270Z] "GET /test HTTP/1.0" 200 40 3 da2a001c-3dc0-4afb-ae0a-a09b78642890 "ApacheBench/2.3" "-" 10.244.0.203:10000 app_service -
  8. [2025-12-30T08:03:41.269Z] "GET /test HTTP/1.0" 200 40 3 3a7f7ec4-42c1-48d3-acf5-190a81439d84 "ApacheBench/2.3" "-" 10.244.0.203:10000 app_service -
  9. [2025-12-30T08:03:41.270Z] "GET /test HTTP/1.0" 200 40 4 3bcd9947-e4c2-43c8-84de-12bd551af590 "ApacheBench/2.3" "-" 10.244.0.203:10000 app_service -
  10. [2025-12-30T08:03:41.270Z] "GET /test HTTP/1.0" 200 40 4 f5f5f231-1079-4abf-8d72-56617d43cc03 "ApacheBench/2.3" "-" 10.244.0.203:10000 app_service -
复制代码
熔断关注的是 并发资源保护,而不是 QPS
限流

熔断解决的是“服务被拖慢”,那么限流解决的是“服务被打爆”,Envoy 的限流目标是:控制单位时间内的请求速率。常见触发场景:

  • 突发流量
  • 单 IP / 单用户恶意请求
  • 上游 Bug 导致请求风暴
限流配置
  1.       listeners:
  2.         - name: ingress_listener
  3.           address:
  4.             socket_address:
  5.               address: 0.0.0.0
  6.               port_value: 10000
  7.           filter_chains:
  8.             - filters:
  9.                 - name: envoy.filters.network.http_connection_manager
  10.                   typed_config:
  11.                     ...
  12.                     http_filters:
  13.                     - name: envoy.filters.http.local_ratelimit
  14.                       typed_config:
  15.                         "@type": type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit
  16.                         stat_prefix: local_rate_limiter
  17.                         token_bucket:
  18.                           max_tokens: 100
  19.                           tokens_per_fill: 100
  20.                           fill_interval: 1s
  21.                         filter_enabled:
  22.                           default_value:
  23.                             numerator: 100
  24.                             denominator: HUNDRED
  25.                         filter_enforced:
  26.                           default_value:
  27.                             numerator: 100
  28.                             denominator: HUNDRED
  29.                     - name: envoy.filters.http.router
  30.                     ...
复制代码
每秒最多 100 个请求,当超过阈值,Envoy 直接返回 429,请求不会进入上游,为了方便测试,将阈值改为5,再次进行ab测试
  1. ab -n 10 -c 10 10.22.12.178:30785/test
复制代码
查看日志:
  1. [2025-12-30T09:58:43.655Z] "GET /test HTTP/1.0" 200 40 1 f775154c-898e-46b2-99d5-b5629493834c "ApacheBench/2.3" "-" 10.244.0.203:10000 app_service -
  2. [2025-12-30T09:58:43.658Z] "GET /test HTTP/1.0" 429 18 0 fde80049-a2df-473e-9f96-08a1526352ce "ApacheBench/2.3" "-" - app_service RL
  3. [2025-12-30T09:58:43.658Z] "GET /test HTTP/1.0" 429 18 0 85d3f948-eb71-4304-88ae-ab1dc29e42b7 "ApacheBench/2.3" "-" - app_service RL
  4. [2025-12-30T09:58:43.658Z] "GET /test HTTP/1.0" 429 18 0 11c01a56-46f1-4bc0-a611-4d32d32e3440 "ApacheBench/2.3" "-" - app_service RL
  5. [2025-12-30T09:58:43.658Z] "GET /test HTTP/1.0" 429 18 0 53d14770-b89a-48ec-a430-a10d28849ccd "ApacheBench/2.3" "-" - app_service RL
  6. [2025-12-30T09:58:43.658Z] "GET /test HTTP/1.0" 429 18 0 2bcfd5d9-bfba-4bda-b178-aaf85389a5c6 "ApacheBench/2.3" "-" - app_service RL
  7. [2025-12-30T09:58:43.658Z] "GET /test HTTP/1.0" 200 40 2 1c56e4ec-b463-4a89-bdcb-978d81ec5826 "ApacheBench/2.3" "-" 10.244.0.203:10000 app_service -
  8. [2025-12-30T09:58:43.658Z] "GET /test HTTP/1.0" 200 40 2 989c07b8-1af3-48f1-9398-fb28ad1ad0bd "ApacheBench/2.3" "-" 10.244.0.203:10000 app_service -
  9. [2025-12-30T09:58:43.658Z] "GET /test HTTP/1.0" 200 40 2 ba224777-066d-4fae-b7e3-e5461c94b236 "ApacheBench/2.3" "-" 10.244.0.203:10000 app_service -
  10. [2025-12-30T09:58:43.658Z] "GET /test HTTP/1.0" 200 40 2 7db78d9a-9a4e-4b41-8f13-6597e28946ce "ApacheBench/2.3" "-" 10.244.0.203:10000 app_service -
复制代码
重要参数

filter_enabled与filter_enforced,简而言之如果配置了前者,而没有配置后者(其中数字代表百分比)
  1. filter_enabled:
  2.   default_value:
  3.     numerator: 100
  4.     denominator: HUNDRED
  5. filter_enforced:
  6.   default_value:
  7.     numerator: 0
  8.     denominator: HUNDRED
复制代码
那就会启动观察者模式(相信玩过AWS WAF的老哥对观察者模式应该非常熟悉了),envoy会记录哪些记录是应该被拦截的,但不会真正拦截,可以从envoy的统计接口观察到
  1. ▶ curl "http://10.244.0.221:9901/stats?filter=local_rate_limit"
  2. local_rate_limiter.http_local_rate_limit.enabled: 11
  3. local_rate_limiter.http_local_rate_limit.enforced: 0
  4. local_rate_limiter.http_local_rate_limit.ok: 6
  5. local_rate_limiter.http_local_rate_limit.rate_limited: 5
复制代码
ok为通过,rate_limited是被限制的请求,由于是观察者模式,只会记录,并不会真正限制
如果两者都配置为numerator: 100,那就代表会严格执行了,一旦超过阈值,会立刻触发429
这里给一个配置表与接口统计信息的表
配置enabled 计数enforced 计数ok 计数rate_limited 计数enabled=100%, enforced=100%增加增加正常超限时增加enabled=100%, enforced=0%增加不增加总是增加不增加enabled=50%, enforced=100%50% 请求增加50% 请求增加变化变化enabled=0%, enforced=任意不增加不增加不增加不增加流量分发

流量分发主要用于:

  • 金丝雀发布
  • 灰度发布
  • A/B 测试
  • 多版本并行运行
按比例分发配置

这是最常用的,按照权重比例分发
  1.                 route_config:
  2.                   name: local_route
  3.                   virtual_hosts:
  4.                     - name: app
  5.                       domains: ["*"]
  6.                       routes:
  7.                         - match: { prefix: "/test" }
  8.                           route:
  9.                             weighted_clusters:
  10.                               clusters:
  11.                                 - name: service-v1
  12.                                   weight: 9
  13.                                 - name: service-v2
  14.                                   weight: 1
复制代码
这里的name,是配置在cluster里面的
  1.   clusters:
  2.     - name: service-v1
  3.       ...
  4.     - name: service-v2
  5.       ...
复制代码
按header分发

按前缀分发

常见于api结构变更,或者api版本升级(v1-->v2)
  1.                 route_config:
  2.                   name: local_route
  3.                   virtual_hosts:
  4.                     - name: app
  5.                       domains: ["*"]
  6.                       routes:
  7.                       - match:
  8.                           prefix: "/test/v1"
  9.                         route:
  10.                           cluster: app_service_v1
  11.                           prefix_rewrite: "/test"
  12.                       - match:
  13.                           prefix: "/test"
  14.                         route:
  15.                           cluster: app_service
复制代码
这里需要注意的是,envoy并没有nginx的复杂优先级规则,什么精确匹配、最大前缀匹配、正则匹配等,envoy就是简单粗暴的按照顺序来
envoy有一套自己的匹配规则
关键字例子解释pathpath: "/test/v1",只匹配 "/test/v1", 多一个字母都会报404精确匹配(失去了nginx的最高优先级)prefixprefix: "/test/v1",匹配 "/test/v1/anything"最大前缀匹配safe_regexregex: "^/test/v1(/.*)?$",匹配 /test/v1 和 /test/v1/*正则匹配透明代理

这部分在之前的文章已经详细描述,使用iptables做流量劫持,这里就不赘述了
总结

Envoy 提供的这些能力,本质上都围绕一件事,Envoy不光是做服务代理,而是做服务治理

  • 熔断:并发保护
  • 限流:速率控制
  • 流量分发:安全发布
  • 透明代理:零侵入接入
在微服务中,特别是服务网格化的今天,越来越强调服务的可观测性,特别是当我们的微服务加上了一层envoy代理之后,对一些非常重要的指标需要更加的关注,比如:envoy层的延时、envoy层是否报错、envoy层的资源消耗等等,这就是下一期的内容了
联系我


  • 联系我,做深入的交流
2.bmp

至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

2026-1-22 09:16:07

举报

5 天前

举报

3 天前

举报

您需要登录后才可以回帖 登录 | 立即注册