本地限速

限速用于控制网络接口控制器发送或接收的请求速率,这有助于防止 DoS 攻击并限制网络抓取。

Envoy 支持本地(非分布式)和全局限速,以及两种类型的本地限速

此沙箱提供了 L4 连接限速的示例。

步骤 1:启动所有容器

更改到 examples/local_ratelimit 目录并启动 docker 组成。

$ pwd
envoy/examples/ratelimit
$ docker compose pull
$ docker compose up --build -d
$ docker compose ps
Name                        Command                          State   Ports
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ratelimtit_envoy-stat_1     /docker-entrypoint.sh /usr ...   Up      0.0.0.0:10000->10000/tcp,:::10000->10000/tcp, 0.0.0.0:9901->9901/tcp,:::9901->9901/tcp, 0.0.0.0:9902->9902/tcp,:::9902->9902/tcp
ratelimtit_service_1        /docker-entrypoint.sh ngin ...   Up      80/tcp

步骤 2:测试上游服务的限速

沙箱配置了 10000 端口用于上游服务。

如果请求达到限速,Envoy 将添加 x-local-rate-limit 标头并拒绝连接,并返回 429 HTTP 响应代码,内容为 local_rate_limited

现在,使用 curl 对受限上游服务发出五个请求

$ for i in {1..5}; do curl -si localhost:10000 | grep -E "x-local-rate-limit|429|local_rate_limited"; done
HTTP/1.1 429 Too Many Requests
x-local-rate-limit: true
local_rate_limited
HTTP/1.1 429 Too Many Requests
x-local-rate-limit: true
local_rate_limited
HTTP/1.1 429 Too Many Requests
x-local-rate-limit: true
local_rate_limited

前两个请求获得响应,其余请求被拒绝,并返回预期响应。

步骤 3:测试 Envoy 统计信息的限速

沙箱配置了两个端口用于提供 Envoy 的管理和统计信息接口

  • 9901 公开标准管理接口

  • 9902 公开管理接口的限速版本

使用 curl 对端口 9901 上的无限制统计信息发出五个请求,它不应包含任何限速响应

$ for i in {1..5}; do curl -si localhost:9901/stats/prometheus | grep -E "x-local-rate-limit|429|local_rate_limited"; done

现在,使用 curl 对受限统计信息发出五个请求

$ for i in {1..5}; do curl -si localhost:9902/stats/prometheus | grep -E "x-local-rate-limit|429|local_rate_limited"; done
HTTP/1.1 429 Too Many Requests
x-local-rate-limit: true
local_rate_limited
HTTP/1.1 429 Too Many Requests
x-local-rate-limit: true
local_rate_limited
HTTP/1.1 429 Too Many Requests
x-local-rate-limit: true
local_rate_limited

另请参见

全局限速

Envoy 的全局限速参考文档。