limit-conn

描述

限制并发请求(或并发连接)插件。

属性

名称类型必选项默认值有效值描述
connintegerconn > 0允许的最大并发请求数。超过 conn 的限制、但是低于 conn + burst 的请求,将被延迟处理。
burstintegerburst >= 0允许被延迟处理的并发请求数。
default_conn_delaynumberdefault_conn_delay > 0默认的典型连接(或请求)的处理延迟时间。
only_use_default_delaybooleanfalse[true,false]延迟时间的严格模式。 如果设置为true的话,将会严格按照设置的时间来进行延迟
key_typestring“var”[“var”, “var_combination”]key 的类型
keystring用来做请求计数的依据。如果 key_type 为 “var”,那么 key 会被当作变量名称,如 “remote_addr” 和 “consumer_name”。如果 key_type 为 “var_combination”,那么 key 会当作变量组合,如 “$remote_addr $consumer_name”。如果 key 的值为空,$remote_addr 会被作为默认 key。
rejected_codestring503[200,…,599]当请求超过 conn + burst 这个阈值时,返回的 HTTP 状态码
rejected_msgstring非空当请求超过 conn + burst 这个阈值时,返回的响应体。
allow_degradationbooleanfalse当插件功能临时不可用时是否允许请求继续。当值设置为 true 时则自动允许请求继续,默认值是 false。

如何启用

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

  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. "id": 1,
  6. "plugins": {
  7. "limit-conn": {
  8. "conn": 1,
  9. "burst": 0,
  10. "default_conn_delay": 0.1,
  11. "rejected_code": 503,
  12. "key_type": "var",
  13. "key": "remote_addr"
  14. }
  15. },
  16. "upstream": {
  17. "type": "roundrobin",
  18. "nodes": {
  19. "127.0.0.1:1980": 1
  20. }
  21. }
  22. }'

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

  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. "id": 1,
  6. "plugins": {
  7. "limit-conn": {
  8. "conn": 1,
  9. "burst": 0,
  10. "default_conn_delay": 0.1,
  11. "rejected_code": 503,
  12. "key_type": "var_combination",
  13. "key": "$consumer_name $remote_addr"
  14. }
  15. },
  16. "upstream": {
  17. "type": "roundrobin",
  18. "nodes": {
  19. "127.0.0.1:1980": 1
  20. }
  21. }
  22. }'

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

enable limit-conn plugin

测试插件

上面启用的插件的参数表示只允许一个并发请求。 当收到多个并发请求时,将直接返回 503 拒绝请求。

  1. curl -i http://127.0.0.1:9080/index.html?sleep=20 &
  2. curl -i http://127.0.0.1:9080/index.html?sleep=20
  3. <html>
  4. <head><title>503 Service Temporarily Unavailable</title></head>
  5. <body>
  6. <center><h1>503 Service Temporarily Unavailable</h1></center>
  7. <hr><center>openresty</center>
  8. </body>
  9. </html>

这就表示 limit-conn 插件生效了。

移除插件

当你想去掉 limit-conn 插件的时候,很简单,在插件的配置中把对应的 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. }
  11. }'

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