速率限制用于控制发送到上游服务的请求速率。它可以用于防止拒绝服务(DoS)攻击、限制网络爬虫以及其他形式的滥用行为。没有速率限制,客户端可以无限制地访问您的上游服务,可能会对可用性产生负面影响。
Kong Gateway通过使用速率限制插件对客户端进行速率限制。当启用速率限制时,客户端在可配置的时间段内受到请求次数的限制。该插件支持将客户端标识为消费者或根据请求的客户端IP地址进行标识。
本教程使用速率限制插件。还有一个名为速率限制高级插件可供选择。高级版本提供了更多功能,如支持滑动窗口算法和高级Redis支持,以实现更高的性能。
以下教程将介绍如何在Kong Gateway中管理各个方面的速率限制。
本章是“开始使用Kong”的系列教程的一部分。为了获得最佳体验,建议您从头开始按照该系列教程进行学习。
首先,请阅读介绍“了解Kong”,其中包括工具先决条件和在本地运行Kong Gateway的说明。
在指南的第二步中,“服务和路由”,包括安装一个贯穿整个系列教程的模拟服务的说明。
如果您还未完成这些步骤,请先完成它们,然后再继续进行。
在全局范围安装插件意味着每个代理请求到Kong Gateway都将受到速率限制的强制执行。
1. 启用速率限制
默认情况下,Kong Gateway上安装了速率限制插件,并且可以通过向Admin API的plugins对象发送POST请求来启用它:
curl -i -X POST http://localhost:8001/plugins \
--data name=rate-limiting \
--data config.minute=5 \
--data config.policy=local
该命令指示Kong Gateway对所有路由和服务的每个客户端IP地址每分钟限制最多5个请求。
策略配置决定了Kong Gateway从哪获取限制并递增。详细信息请参阅完整的插件配置参考。
您将看到一个包含新插件配置的响应,其中包括类似于标识信息的内容:
...
"id": "fc559a2d-ac80-4be8-8e43-cb705524be7f",
"name": "rate-limiting",
"enabled": true
...
2. 验证
在配置了速率限制之后,您可以通过发送超过配置时间限制的请求来验证其是否正确配置并起作用。
命令行:
运行以下命令以快速发送6个模拟请求:
for _ in {1..6}; do curl -s -i localhost:8000/mock/anything; echo; sleep 1; done
在第6个请求之后,您应该会收到一个429“API速率限制超过限制”的错误。
{
"message": "API rate limit exceeded"
}
Web浏览器:
在浏览器中打开http://localhost:8000/mock/anything,并在1分钟内刷新页面6次。
在第6个请求之后,您应该会收到一个429“API速率限制超过限制”的错误。
{
"message": "API rate limit exceeded"
}
可以为特定服务启用速率限制插件。请求与上述相同,但应该将请求发送到服务的URL。
curl -X POST http://localhost:8001/services/example_service/plugins \
--data "name=rate-limiting" \
--data config.minute=5 \
--data config.policy=local
可以为特定路由启用速率限制插件。请求与上述相同,但应该将请求发送到路由的URL。
curl -X POST http://localhost:8001/routes/example_route/plugins \
--data "name=rate-limiting" \
--data config.minute=5 \
--data config.policy=local
在Kong Gateway中,消费者是定义服务的用户的抽象概念。消费者级速率限制可以用于按消费者限制请求速率。
1. 创建一个消费者
使用Admin API中的consumer对象可以创建消费者。
curl -X POST http://localhost:8001/consumers/ \
--data username=jsmith
2. 为消费者启用速率限制
使用消费者ID,为名为jsmith的消费者的所有路由和服务启用速率限制。
curl -X POST http://localhost:8001/plugins \
--data "name=rate-limiting" \
--data "consumer.username=jsmith" \
--data "config.second=5"
在高规模生产场景中,有效的速率限制可能需要采用高级技术。上述基本速率限制插件只允许您在固定时间窗口内定义限制。对于许多情况来说,固定时间窗口已经足够,但也存在一些缺点:
高级速率限制插件(企业版)是基本速率限制插件的增强版。该高级插件提供了额外的限流算法功能,并且与基本插件相比具有更高的性能。