workflow

描述

workflow 插件引入 lua-resty-expr 来提供复杂的流量控制功能。

属性

名称类型必选项默认值有效值描述
rules.casearray[array]由一个或多个{var, operator, val}元素组成的列表,类似这样:{{var, operator, val}, {var, operator, val}, …}}。例如:{“arg_name”, “==”, “json”},表示当前请求参数 name 是 json。这里的 var 与 NGINX 内部自身变量命名保持一致,所以也可以使用 request_uri、host 等;对于 operator 部分,目前已支持的运算符有 ==、~=、~~、>、<、in、has 和 ! 。关于操作符的具体用法请参考 lua-resty-exproperator-list 部分。
rules.actionsarray[object]case 成功匹配时要执行的 actions。目前,actions 中只支持一个元素。actions 的唯一元素的第一个子元素可以是 returnlimit-count

actions 属性

return

名称类型必选项默认值有效值描述
actions[1].returnstring直接返回到客户端。
actions[1].[2].codeinteger返回给客户端的 HTTP 状态码。

limit-count

名称类型必选项默认值有效值描述
actions[1].limit-countstring执行 limit-count 插件的功能。
actions[1].[2]objectlimit-count 插件的配置。
workflow - 图1note

rules 中,按照 rules 的数组下标顺序依次匹配 case,如果 case 匹配成功,则直接执行对应的 actions

启用插件

以下示例展示了如何在路由中启用 workflow 插件:

workflow - 图2note

您可以这样从 config.yaml 中获取 admin_key 并存入环境变量:

  1. admin_key=$(yq '.deployment.admin.admin_key[0].key' conf/config.yaml | sed 's/"//g')
  1. curl http://127.0.0.1:9180/apisix/admin/routes/1 \
  2. -H "X-API-KEY: $admin_key" -X PUT -d '
  3. {
  4. "uri":"/hello/*",
  5. "plugins":{
  6. "workflow":{
  7. "rules":[
  8. {
  9. "case":[
  10. ["uri", "==", "/hello/rejected"]
  11. ],
  12. "actions":[
  13. [
  14. "return",
  15. {"code": 403}
  16. ]
  17. ]
  18. },
  19. {
  20. "case":[
  21. ["uri", "==", "/hello/v2/appid"]
  22. ],
  23. "actions":[
  24. [
  25. "limit-count",
  26. {
  27. "count":2,
  28. "time_window":60,
  29. "rejected_code":429
  30. }
  31. ]
  32. ]
  33. }
  34. ]
  35. }
  36. },
  37. "upstream":{
  38. "type":"roundrobin",
  39. "nodes":{
  40. "127.0.0.1:1980":1
  41. }
  42. }
  43. }'

如上,我们启用了 workflow 插件,如果请求与 rules 中的 case 匹配,则会执行对应的 actions

示例 1: 如果请求的 uri 是 /hello/rejected,则返回给客户端状态码 403

  1. curl http://127.0.0.1:9080/hello/rejected -i
  2. HTTP/1.1 403 Forbidden
  3. ......
  4. {"error_msg":"rejected by workflow"}

示例 2: 如果请求的 uri 是 /hello/v2/appid,则执行 limit-count 插件,限制请求的数量为 2,时间窗口为 60 秒,如果超过限制数量,则返回给客户端状态码 429

  1. curl http://127.0.0.1:9080/hello/v2/appid -i
  2. HTTP/1.1 200 OK
  1. curl http://127.0.0.1:9080/hello/v2/appid -i
  2. HTTP/1.1 200 OK
  1. curl http://127.0.0.1:9080/hello/v2/appid -i
  2. HTTP/1.1 429 Too Many Requests

示例 3: 如果请求不能被任何 case 匹配,则 workflow 不会执行任何操作

  1. curl http://127.0.0.1:0080/hello/fake -i
  2. HTTP/1.1 200 OK

Delete Plugin

当你需要禁用 workflow 插件时,可以通过以下命令删除相应的 JSON 配置,APISIX 将会自动重新加载相关配置,无需重启服务:

  1. curl http://127.0.0.1:9180/apisix/admin/routes/1 \
  2. -H "X-API-KEY: $admin_key" -X PUT -d '
  3. {
  4. "uri":"/hello/*",
  5. "upstream": {
  6. "type": "roundrobin",
  7. "nodes": {
  8. "127.0.0.1:1980": 1
  9. }
  10. }
  11. }'