limit-count
limit-count 插件使用固定窗口算法,根据给定时间间隔内的请求数量来限制请求速率。超过配置配额的请求将被拒绝。
你可能会在响应中看到以下限速响应头:
X-RateLimit-Limit: 总配额X-RateLimit-Remaining: 剩余配额X-RateLimit-Reset: 计数器重置前的剩余秒数
如果你使用的是 API7 企业版,可以通过插件元数据自定义这些响应头的名称。
自 API7 企业版 version 3.9.14 起,高级限速能力已直接内置于 limit-count,包括用于高可用的 redis-sentinel 策略、在窗口边界处实施更平滑的 sliding window_type、通过 sync_interval 实现的延迟同步、通过 rules 数组配置多条限速规则,以及从请求变量派生 count。独立的 limit-count-advanced 插件仍保留以实现向后兼容。
示例
以下示例展示了如何在不同场景下配置 limit-count。
根据远程地址进行限速
以下示例演示了如何通过单个变量 remote_addr 对请求进行限速。
创建一个使用 limit-count 插件的路由,允许每个远程地址在 30 秒窗口内请求 1 次:
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "limit-count-route",
"uri": "/get",
"plugins": {
"limit-count": {
"count": 1,
"time_window": 30,
"rejected_code": 429,
"key_type": "var",
"key": "remote_addr"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'
发送请求以验证:
curl -i "http://127.0.0.1:9080/get"
你应该会看到 HTTP/1.1 200 OK 响应。
该请求已消耗了时间窗口内允许的所有配额。如果你在同一个 30 秒时间间隔内再次发送请求,应该会收到 HTTP/1.1 429 Too Many Requests 响应,表明请求超过了配额阈值。
使用滑动窗口进行限速
以下示例演示了如何通过将 window_type 设置为 sliding 来使用滑动窗 口算法(自 API7 企业版 version 3.9.14 起可用)。与默认的固定窗口相比,滑动窗口在计算当前请求计数时对上一个窗口进行加权,从而平滑窗口边界处的突发流量。
创建一个使用 limit-count 插件的路由,允许每个远程地址在 30 秒滑动窗口内请求 10 次:
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "limit-count-route",
"uri": "/get",
"plugins": {
"limit-count": {
"count": 10,
"time_window": 30,
"rejected_code": 429,
"key_type": "var",
"key": "remote_addr",
"policy": "local",
"window_type": "sliding"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'
发送请求以验证:
curl -i "http://127.0.0.1:9080/get"
你应该会看到 HTTP/1.1 200 OK 响应。当你持续发送请求时,滑动窗口会在连续窗口的边界处比固定窗口更均匀地实施配额。