种类及集群支持
apisix 2.13.1 limit 有3种limit
- limit-conn :允许的最大并发请求数。超过 conn 的限制、但是低于 conn + burst 的请求,将被延迟处理。
- limit-count :和 GitHub API 的限速 类似, 在指定的时间范围内,限制总的请求个数。并且在 HTTP 响应头中返回剩余可以请求的个数。
- limit-req :指定的请求速率(以秒为单位),请求速率超过 rate 但没有超过 (rate + burst)的请求会被加上延时。
limit-count和limit-req是相似的。
这三种模式中,只有limit-count可以使用redis进行数据存储,即只有limit-count是支持cluster模式,当然其它2种自己也可以参考修改支持cluster。
注意limit-count支持redis单点及cluster两种模式,以下是对接redis cluster的示意:
curl -i http://127.0.0.1:9080/apisix/admin/routes/3 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/index.html",
"plugins": {
"limit-count": {
"count": 2,
"time_window": 60,
"rejected_code": 503,
"key": "remote_addr",
"policy": "redis-cluster",
"redis_cluster_nodes": [
"192.168.157.151:7001",
"192.168.157.151:7002",
"192.168.157.151:7003"
],
"redis_password": "123456",
"redis_cluster_name": "redis-cluster-1"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"192.168.157.151:9081": 1
}
}
}'
按consumer、IP进行limit
limit-req只能按以下之一进行限制:
用来做请求计数的依据,当前接受的 key 有:“remote_addr”(客户端IP地址), “server_addr”(服务端 IP 地址), 请求头中的"X-Forwarded-For" 或 “X-Real-IP”,“consumer_name”(consumer 的 username)。
其它两种支持将consumer和ip结合起来限制,但结合后每个consumer的限制都是一样的,如果要对不同consumer支持不同限制,需要
- 使用不同route
- 自定义修改
- 开发ext plugin
按consumer需要先识别用户,即需要同时使用authentication plug,以下为 以下为用户+客户端ip模式示意:
curl -i http://127.0.0.1:9080/apisix/admin/routes/10 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/consumer",
"plugins": {
"basic-auth": {},
"limit-count": {
"count": 2,
"time_window": 60,
"rejected_code": 503,
"key_type": "var_combination",
"key": "$consumer_name $remote_addr"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"192.168.157.151:9081": 1
}
}
}'