limit-count

    下面是一个示例,在指定的 route 上开启了 limit count 插件,并设置 key_typevar

    下面是一个示例,在指定的 route 上开启了 limit count 插件,并设置 key_typevar_combination

    1. curl -i http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
    2. {
    3. "uri": "/index.html",
    4. "plugins": {
    5. "limit-count": {
    6. "count": 2,
    7. "time_window": 60,
    8. "rejected_code": 503,
    9. "key_type": "var_combination",
    10. "key": "$consumer_name $remote_addr"
    11. }
    12. },
    13. "upstream": {
    14. "type": "roundrobin",
    15. "nodes": {
    16. "127.0.0.1:9001": 1
    17. }
    18. }
    19. }'

    你也可以通过 web 界面来完成上面的操作,先增加一个 route,然后在插件页面中添加 limit-count 插件:

    我们也支持在多个 Route 间共享同一个限流计数器。举个例子,

    1. curl -i http://127.0.0.1:9080/apisix/admin/services/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
    2. {
    3. "plugins": {
    4. "limit-count": {
    5. "count": 1,
    6. "time_window": 60,
    7. "rejected_code": 503,
    8. "key": "remote_addr",
    9. "group": "services_1#1640140620"
    10. }
    11. },
    12. "upstream": {
    13. "type": "roundrobin",
    14. "127.0.0.1:1980": 1
    15. }
    16. }
    17. }'

    每个配置了 groupservices_1#1640140620 的 Route 都将共享同一个每个 IP 地址每分钟只能访问一次的计数器。

    1. $ curl -i http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
    2. {
    3. "service_id": "1",
    4. }'
    5. $ curl -i http://127.0.0.1:9080/apisix/admin/routes/2 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
    6. {
    7. "service_id": "1",
    8. "uri": "/hello2"
    9. }'
    10. $ curl -i http://127.0.0.1:9080/hello
    11. HTTP/1.1 200 ...
    12. $ curl -i http://127.0.0.1:9080/hello2
    13. HTTP/1.1 503 ...

    我们也支持在所有请求间共享同一个限流计数器。举个例子,

    在上面的例子中,我们将 key_type 设置为 constant。 通过设置 key_typeconstantkey 的值将会直接作为常量来处理。

    现在每个配置了 groupservices_1#1640140620 的 Route 上的所有请求,都将共享同一个每分钟只能访问一次的计数器,即使它们来自不同的 IP 地址。

    如果你需要一个集群级别的流量控制,我们可以借助 redis server 来完成。不同的 APISIX 节点之间将共享流量限速结果,实现集群流量限速。

    如果启用单 redis 策略,请看下面例子:

    1. curl -i http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
    2. {
    3. "uri": "/index.html",
    4. "plugins": {
    5. "limit-count": {
    6. "count": 2,
    7. "time_window": 60,
    8. "rejected_code": 503,
    9. "key": "remote_addr",
    10. "policy": "redis",
    11. "redis_host": "127.0.0.1",
    12. "redis_port": 6379,
    13. "redis_password": "password",
    14. "redis_database": 1,
    15. "redis_timeout": 1001
    16. }
    17. },
    18. "upstream": {
    19. "type": "roundrobin",
    20. "nodes": {
    21. "127.0.0.1:1980": 1
    22. }
    23. }
    24. }'

    如果使用 redis-cluster 策略:

    1. curl -i http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
    2. {
    3. "uri": "/index.html",
    4. "plugins": {
    5. "count": 2,
    6. "time_window": 60,
    7. "rejected_code": 503,
    8. "key": "remote_addr",
    9. "redis_cluster_nodes": [
    10. "127.0.0.1:5000",
    11. "127.0.0.1:5001"
    12. ],
    13. "redis_password": "password",
    14. "redis_cluster_name": "redis-cluster-1"
    15. }
    16. },
    17. "upstream": {
    18. "type": "roundrobin",
    19. "nodes": {
    20. "127.0.0.1:1980": 1
    21. }
    22. }
    23. }'
    1. curl -i http://127.0.0.1:9080/index.html

    响应头里面包含了 X-RateLimit-LimitX-RateLimit-Remaining,他们的含义分别是限制的总请求数和剩余还可以发送的请求数:

    当你第三次访问的时候,就会收到包含 503 返回码的响应头:

    1. HTTP/1.1 503 Service Temporarily Unavailable
    2. Content-Type: text/html
    3. Content-Length: 194
    4. Connection: keep-alive
    5. Server: APISIX web server
    6. <html>
    7. <head><title>503 Service Temporarily Unavailable</title></head>
    8. <body>
    9. <center><h1>503 Service Temporarily Unavailable</h1></center>
    10. <hr><center>openresty</center>
    11. </body>
    12. </html>

    同时,如果你设置了属性 rejected_msg 的值为 "Requests are too frequent, please try again later." ,当你第三次访问的时候,就会收到如下的响应体:

    1. HTTP/1.1 503 Service Temporarily Unavailable
    2. Content-Type: text/html
    3. Content-Length: 194
    4. Connection: keep-alive
    5. Server: APISIX web server
    6. {"error_msg":"Requests are too frequent, please try again later."}

    这就表示 limit count 插件生效了。

    当你想去掉 limit count 插件的时候,很简单,在插件的配置中把对应的 json 配置删除即可,无须重启服务,即刻生效:

    1. curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
    2. {
    3. "methods": ["GET"],
    4. "uri": "/index.html",
    5. "upstream": {
    6. "type": "roundrobin",
    7. "nodes": {
    8. "127.0.0.1:1980": 1
    9. }
    10. }

    现在就已经移除了 limit count 插件了。其他插件的开启和移除也是同样的方法。