跳到主要内容

配置限流限速

限流限速是 API 管理中的一种常用技术,用于为用户设置配额并保护 API 免受网络爬虫和恶意行为者产生的过多请求的影响。这有助于确保上游服务的公平使用并提高基础设施的可用性。


路由图解

APISIX 提供了许多限流限速插件,可以轻松配置以满足你的需求:

  • limit-count:限制给定时间间隔内的请求数量。
  • limit-req:限制给定时间间隔内的请求数量和设置容量(漏桶算法)。
  • limit-conn:限制并发连接数。
  • graphql-limit-count:限制给定时间间隔内 GraphQL 操作或变更的深度。这是一项企业功能。

本指南将向你展示如何为不同 API 定价计划中的消费者实施不同的限流限速配额,如 消费者组 中所示。你可以根据需要用其他可用的限流限速插件替换本指南中使用的 limit-count 插件。

备注

APISIX Ingress Controller 目前不支持消费者组。有关单个消费者的限流限速,请参阅 快速入门 - 限流限速

前置条件

  • 安装 Docker
  • 安装 cURL 以向服务发送请求进行验证。
  • 按照 快速入门教程 在 Docker 中启动一个新的 APISIX 实例。

创建消费者组

为具有较低 API 配额的基本计划创建一个消费者组:

curl "http://127.0.0.1:9180/apisix/admin/consumer_groups" -X PUT -d '
{
"id": "basic_plan",
"plugins": {
"limit-count": {
// Annotate 1
"count": 2,
"time_window": 30,
// Annotate 2
"rejected_code": 429
}
}
}'

count, time_window:允许在 30 秒的时间间隔内进行 2 次请求。

rejected_code:如果请求超过配额,则返回 HTTP 429 Too Many Requests 响应。

同样,为具有较高 API 配额的高级计划创建一个消费者组:

curl "http://127.0.0.1:9180/apisix/admin/consumer_groups" -X PUT -d '
{
"id": "premium_plan",
"plugins": {
"limit-count": {
"count": 20,
"time_window": 30,
"rejected_code": 429
}
}
}'

创建消费者

在基本计划中创建一个消费者 JohnDoe

curl "http://127.0.0.1:9180/apisix/admin/consumers" -X PUT -d '
{
"username": "JohnDoe",
"group_id": "basic_plan",
"plugins": {
"key-auth": {
"key": "john-key"
}
}
}'

在基本计划中创建第二个消费者 JaneDoe

curl "http://127.0.0.1:9180/apisix/admin/consumers" -X PUT -d '
{
"username": "JaneDoe",
"group_id": "basic_plan",
"plugins": {
"key-auth": {
"key": "jane-key"
}
}
}'

在高级计划中创建一个消费者 FetchBot

curl "http://127.0.0.1:9180/apisix/admin/consumers" -X PUT -d '
{
"username": "FetchBot",
"group_id": "premium_plan",
"plugins": {
"key-auth": {
"key": "bot-key"
}
}
}'

创建路由

创建一个启用了密钥认证的路由:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{
"id": "rate-limiting",
"uri": "/internal",
"plugins": {
"key-auth": {}
},
"upstream" : {
"nodes": {
"mock.api7.ai:443": 1
},
"pass_host": "node",
"scheme": "https"
}
}'

验证限流限速

验证基本计划的配额

以消费者 JohnDoe 的身份向路由发送 10 个并发请求:

resp=$(seq 10 | xargs -I{} curl "http://127.0.0.1:9080/internal" -H 'apikey: john-key' -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: 2, 429: 8

如果你使用 JaneDoe 的密钥发送请求,你应该观察到相同的限流行为。

这验证了基本计划的限流限速配额已生效。

验证高级计划的配额

以消费者 FetchBot 的身份向路由发送 30 个并发请求:

resp=$(seq 30 | xargs -I{} curl "http://127.0.0.1:9080/internal" -H 'apikey: bot-key' -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: 20, 429: 10

这验证了高级计划的限流限速配额已生效。

下一步

你现在已经了解了 APISIX 中可用的限流限速插件,以及如何为不同消费者组中的消费者实施不同的限流限速配额。

探索插件参考以了解有关如何针对你的用例实施限流限速的更多信息。