跳到主要内容

限流限速

作为 API 网关,APISIX 充当海量请求的统一入口点,这些请求可能包含合法流量和不需要的流量。

限流限速是保护和管理 API 的常用技术之一。例如,你可以配置 API 端点以允许在给定时间段内进行一定数量的请求。这确保了上游服务的公平使用,并保护 API 免受潜在的网络攻击,如 DDoS(分布式拒绝服务)或网络爬虫的过度请求。


Routes Diagram

在本教程中,你将启用 limit-count 插件来对传入流量设置限流限速约束。

前置条件

  1. 完成 安装 APISIX 以在 Docker 或 Kubernetes 中安装 APISIX。
  2. 完成 配置路由
  3. 如果使用这些工具,请安装 ADCAPISIX-MCP

启用限流限速

使用 limit-count 插件更新 配置路由 中的 getting-started-ip 路由:

curl -i "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip" -X PATCH -d '
{
"plugins": {
"limit-count": {
"count": 2,
"time_window": 10,
"rejected_code": 429
}
}
}'

如果插件添加成功,你将收到 HTTP/1.1 200 OK 响应。

上述配置将传入请求限制为 10 秒内最多 2 个请求。

验证

生成 50 个并发请求以查看限流限速插件的效果。

resp=$(seq 50 | xargs -I{} curl "http://127.0.0.1:9080/ip" -o /dev/null -s -w "%{http_code}\n") && \
count_200=$(echo "$resp" | grep "200" | wc -l) && \
count_429=$(echo "$resp" | grep "429" | wc -l) && \
echo "200": $count_200, "429": $count_429

结果符合预期:在 50 个请求中,2 个请求发送成功(状态码 200),而其他请求被拒绝(状态码 429)。

"200": 2, "429": 48

禁用限流限速

通过将 _meta.disable 参数设置为 true 来禁用限流限速:

curl -i "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip" -X PATCH -d '
{
"plugins": {
"limit-count": {
"_meta": {
"disable": true
}
}
}
}'

验证

再次生成 50 个请求以验证限流限速是否已禁用:

resp=$(seq 50 | xargs -I{} curl "http://127.0.0.1:9080/ip" -o /dev/null -s -w "%{http_code}\n") && \
count_200=$(echo "$resp" | grep "200" | wc -l) && \
count_429=$(echo "$resp" | grep "429" | wc -l) && \
echo "200": $count_200, "429": $count_429

下面的结果显示所有请求都发送成功:

"200": 50, "429": 0

更多

你可以使用 APISIX 变量 配置细粒度的限流限速匹配规则,例如 $host$uri。此外,APISIX 还支持 使用 Redis 进行集群级别的限流限速

下一步

你已经学习了如何配置限流限速并完成了快速入门教程。

你可以继续探索其他文档以自定义 APISIX 并满足你的生产需求。