Skip to main content
Version: Next

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 插件的配置。
note

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

启用插件#

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

note

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

admin_key=$(yq '.deployment.admin.admin_key[0].key' conf/config.yaml | sed 's/"//g')
curl http://127.0.0.1:9180/apisix/admin/routes/1 \
-H "X-API-KEY: $admin_key" -X PUT -d '
{
"uri":"/hello/*",
"plugins":{
"workflow":{
"rules":[
{
"case":[
["uri", "==", "/hello/rejected"]
],
"actions":[
[
"return",
{"code": 403}
]
]
},
{
"case":[
["uri", "==", "/hello/v2/appid"]
],
"actions":[
[
"limit-count",
{
"count":2,
"time_window":60,
"rejected_code":429
}
]
]
}
]
}
},
"upstream":{
"type":"roundrobin",
"nodes":{
"127.0.0.1:1980":1
}
}
}'

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

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

curl http://127.0.0.1:9080/hello/rejected -i
HTTP/1.1 403 Forbidden
......

{"error_msg":"rejected by workflow"}

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

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

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

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

Delete Plugin#

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

curl http://127.0.0.1:9180/apisix/admin/routes/1 \
-H "X-API-KEY: $admin_key" -X PUT -d '
{
"uri":"/hello/*",
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:1980": 1
}
}
}'