This is an automated email from the ASF dual-hosted git repository.

juzhiyuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git


The following commit(s) were added to refs/heads/master by this push:
     new 8f763c789 docs: add docs of workflow plugin (#7813)
8f763c789 is described below

commit 8f763c789d778d67a80c59aa6a3c3dfed6fe62aa
Author: tzssangglass <[email protected]>
AuthorDate: Wed Aug 31 15:34:13 2022 +0800

    docs: add docs of workflow plugin (#7813)
---
 docs/en/latest/config.json         |   3 +-
 docs/en/latest/plugins/workflow.md | 165 +++++++++++++++++++++++++++++++++++++
 docs/zh/latest/config.json         |   3 +-
 docs/zh/latest/plugins/workflow.md | 165 +++++++++++++++++++++++++++++++++++++
 4 files changed, 334 insertions(+), 2 deletions(-)

diff --git a/docs/en/latest/config.json b/docs/en/latest/config.json
index edb489ce4..05ee49c9e 100644
--- a/docs/en/latest/config.json
+++ b/docs/en/latest/config.json
@@ -162,7 +162,8 @@
             "plugins/serverless",
             "plugins/azure-functions",
             "plugins/openwhisk",
-            "plugins/aws-lambda"
+            "plugins/aws-lambda",
+            "plugins/workflow"
           ]
         },
         {
diff --git a/docs/en/latest/plugins/workflow.md 
b/docs/en/latest/plugins/workflow.md
new file mode 100644
index 000000000..9fe784596
--- /dev/null
+++ b/docs/en/latest/plugins/workflow.md
@@ -0,0 +1,165 @@
+---
+title: workflow
+keywords:
+  - APISIX
+  - Plugin
+  - workflow
+  - traffic control
+description: This document describes the Apache APISIX workflow Plugin, you 
can use it to control traffic.
+---
+
+<!--
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+-->
+
+## Description
+
+The `workflow` plugin is used to introduce 
[lua-resty-expr](https://github.com/api7/lua-resty-expr#operator-list) to 
provide complex traffic control features.
+
+## Attributes
+
+| Name                         | Type          | Required | Default | Valid 
values | Description                                                  |
+| ---------------------------- | ------------- | -------- | ------- | 
------------ | ------------------------------------------------------------ |
+| rules.case                   | array[array]  | True     |         |          
    | List of variables to match for filtering requests for conditional traffic 
split. It is in the format `{variable operator value}`. For example, 
`{"arg_name", "==", "json"}`. The variables here are consistent with NGINX 
internal variables. For details on supported operators, you can refer to 
[lua-resty-expr](https://github.com/api7/lua-resty-expr#operator-list). |
+| rules.actions                | array[object] | True     |         |          
    | The action to be performed when the case matches successfully. Currently, 
only one element is supported in actions. The first child element of the 
actions' only element can be `return` or `limit-count`. |
+
+### `actions` Attributes
+
+#### return
+
+| Name                   | Type          | Required | Default | Valid values | 
Description                                                  |
+| ---------------------- | ------------- | -------- | ------- | ------------ | 
----------------------------------------------------------   |
+| actions[1].return      | string        | False    |         |              | 
Return directly to the client.                               |
+| actions[1].[2].code    | integer       | False    |         |              | 
HTTP status code returned to the client.                     |
+
+#### limit-count
+
+| Name                   | Type          | Required | Default | Valid values | 
Description                                                      |
+| ---------------------- | ------------- | -------- | ------- | ------------ | 
---------------------------------------------------------------- |
+| actions[1].limit-count | string        | False    |         |              | 
Execute the functions of the `limit-count` plugin.               |
+| actions[1].[2]         | object        | False    |         |              | 
Configuration of `limit-count` plugin, `group` is not supported. |
+
+:::note
+
+In `rules`, match `case` in order according to the index of the `rules`, and 
execute `actions` directly if `case` match.
+
+:::
+
+## Enabling the Plugin
+
+You can configure the `workflow` plugin on a Route as shown below:
+
+```shell
+curl http://127.0.0.1:9180/apisix/admin/routes/1 \
+-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -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
+        }
+    }
+}'
+```
+
+Here, the `workflow` Plugin is enabled on the Route. If the request matches 
the `case` in the `rules`, the `actions` will be executed.
+
+**Example 1: If the requested uri is `/hello/rejected`, the status code `403` 
is returned to the client**
+
+```shell
+curl http://127.0.0.1:9080/hello/rejected -i
+HTTP/1.1 403 Forbidden
+......
+
+{"error_msg":"rejected by workflow"}
+```
+
+**Example 2: if the request uri is `/hello/v2/appid`, the `workflow` plugin 
would execute the `limit-count` plugin**
+
+```shell
+curl http://127.0.0.1:0080/hello/v2/appid -i
+HTTP/1.1 200 OK
+```
+
+```shell
+curl http://127.0.0.1:0080/hello/v2/appid -i
+HTTP/1.1 200 OK
+```
+
+```shell
+curl http://127.0.0.1:0080/hello/v2/appid -i
+HTTP/1.1 429 Too Many Requests
+```
+
+**Example 3: if the request can not match any `case` in the `rules`, the 
`workflow` plugin would do nothing**
+
+```shell
+curl http://127.0.0.1:0080/hello/fake -i
+HTTP/1.1 200 OK
+```
+
+## Disable Plugin
+
+To disable the `workflow` plugin, you can delete the corresponding JSON 
configuration from the Plugin configuration. APISIX will automatically reload 
and you do not have to restart for this to take effect.
+
+```shell
+curl http://127.0.0.1:9180/apisix/admin/routes/1 \
+-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
+{
+    "uri":"/hello/*",
+    "upstream": {
+        "type": "roundrobin",
+        "nodes": {
+            "127.0.0.1:1980": 1
+        }
+    }
+}'
+```
diff --git a/docs/zh/latest/config.json b/docs/zh/latest/config.json
index 686e68a00..252788b40 100644
--- a/docs/zh/latest/config.json
+++ b/docs/zh/latest/config.json
@@ -166,7 +166,8 @@
             "plugins/serverless",
             "plugins/azure-functions",
             "plugins/openwhisk",
-            "plugins/aws-lambda"
+            "plugins/aws-lambda",
+            "plugins/workflow"
           ]
         },
         {
diff --git a/docs/zh/latest/plugins/workflow.md 
b/docs/zh/latest/plugins/workflow.md
new file mode 100644
index 000000000..5eba62d7f
--- /dev/null
+++ b/docs/zh/latest/plugins/workflow.md
@@ -0,0 +1,165 @@
+---
+title: workflow
+keywords:
+  - APISIX
+  - Plugin
+  - workflow
+  - 流量控制
+description: 本文介绍了关于 Apache APISIX `workflow` 插件的基本信息及使用方法,你可以基于此插件进行复杂的流量操作。
+---
+
+<!--
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+-->
+
+## 描述
+
+`workflow` 插件引入 
[lua-resty-expr](https://github.com/api7/lua-resty-expr#operator-list) 
来提供复杂的流量控制功能。
+
+## 属性
+
+| 名称          | 类型   | 必选项  | 默认值                    | 有效值                     
                                                                                
                                       | 描述 |
+| ------------- | ------ | ------ | ------------------------ | 
--------------------------------------------------------------------------------------------------------------------------------------------------
 | ------------- |
+| rules.case | array[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-expr](https://github.com/api7/lua-resty-expr#operator-lis [...]
+| rules.actions | array[object] | 是    |                   |                   
                                                                                
             | 当 `case` 成功匹配时要执行的 `actions`。目前,`actions` 中只支持一个元素。`actions` 
的唯一元素的第一个子元素可以是 `return` 或 `limit-count`。 |
+
+### `actions` 属性
+
+#### return
+
+| 名称          | 类型   | 必选项  | 默认值                    | 有效值  | 描述 |
+| ------------- | ------ | ------ | ------------------------ | ----| 
------------- |
+| actions[1].return | string | 否     |                      |  | 直接返回到客户端。 |
+| actions[1].[2].code | integer | 否 |  | | 返回给客户端的 HTTP 状态码。 |
+
+#### limit-count
+
+| 名称          | 类型   | 必选项  | 默认值                    | 有效值  | 描述 |
+| ------------- | ------ | ------ | ------------------------ | ----| 
------------- |
+| actions[1].limit-count | string | 否 |  | | 执行 `limit-count` 插件的功能。 |
+| actions[1].[2] | object | 否 |  | | `limit-count` 插件的配置。 |
+
+:::note
+
+在 `rules` 中,按照 `rules` 的数组下标顺序依次匹配 `case`,如果 `case` 匹配成功,则直接执行对应的 `actions`。
+
+:::
+
+## 启用插件
+
+以下示例展示了如何在路由中启用 `workflow` 插件:
+
+```shell
+curl http://127.0.0.1:9180/apisix/admin/routes/1 \
+-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -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`**
+
+```shell
+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`**
+
+```shell
+curl http://127.0.0.1:0080/hello/v2/appid -i
+HTTP/1.1 200 OK
+```
+
+```shell
+curl http://127.0.0.1:0080/hello/v2/appid -i
+HTTP/1.1 200 OK
+```
+
+```shell
+curl http://127.0.0.1:0080/hello/v2/appid -i
+HTTP/1.1 429 Too Many Requests
+```
+
+**示例 3: 如果请求不能被任何 `case` 匹配,则 `workflow` 不会执行任何操作**
+
+```shell
+curl http://127.0.0.1:0080/hello/fake -i
+HTTP/1.1 200 OK
+```
+
+## Disable Plugin
+
+当你需要禁用 `workflow` 插件时,可以通过以下命令删除相应的 JSON 配置,APISIX 将会自动重新加载相关配置,无需重启服务:
+
+```shell
+curl http://127.0.0.1:9180/apisix/admin/routes/1 \
+-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
+{
+    "uri":"/hello/*",
+    "upstream": {
+        "type": "roundrobin",
+        "nodes": {
+            "127.0.0.1:1980": 1
+        }
+    }
+}'
+```

Reply via email to