Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(traffic-split): configure multiple "rules", the request will be confused between upstream #4092

Merged
merged 5 commits into from
Apr 22, 2021
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions apisix/plugins/traffic-split.lua
Original file line number Diff line number Diff line change
Expand Up @@ -278,8 +278,7 @@ function _M.access(conf, ctx)
return
end

local rr_up, err = core.lrucache.plugin_ctx(lrucache, ctx, nil, new_rr_obj,
weighted_upstreams)
local rr_up, err = lrucache(weighted_upstreams, nil, new_rr_obj, weighted_upstreams)
if not rr_up then
core.log.error("lrucache roundrobin failed: ", err)
return 500
Expand Down
93 changes: 93 additions & 0 deletions docs/en/latest/plugins/traffic-split.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ title: traffic-split
- [Grayscale Release](#grayscale-release)
- [Blue-green Release](#blue-green-release)
- [Custom Release](#custom-release)
- [Matching rules correspond to upstream](#matching-rules-correspond-to-upstream)
- [Disable Plugin](#disable-plugin)

## Name
Expand Down Expand Up @@ -482,6 +483,98 @@ Content-Type: text/html; charset=utf-8
hello 1980
```

### Matching rules correspond to upstream

How to make different matching rules correspond to different upstreams. We can achieve this by configuring multiple `rules.match` + `rules.weighted_upstreams`.
Firstsawyou marked this conversation as resolved.
Show resolved Hide resolved

**Example:**

When the request header `x-api-id` is equal to 1, it hits the upstream of port 1981; when `x-api-id` is equal to 2, it hits the upstream of port 1982; otherwise, it hits the upstream of port 1980 (the upstream response data is the corresponding port number).
Firstsawyou marked this conversation as resolved.
Show resolved Hide resolved

```shell
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/hello",
"plugins": {
"traffic-split": {
"rules": [
{
"match": [
{
"vars": [
["http_x-api-id","==","1"]
]
}
],
"weighted_upstreams": [
{
"upstream": {
"name": "upstream-A",
"type": "roundrobin",
"nodes": {
"127.0.0.1:1981":1
}
},
"weight": 3
}
]
},
{
"match": [
{
"vars": [
["http_x-api-id","==","2"]
]
}
],
"weighted_upstreams": [
{
"upstream": {
"name": "upstream-B",
"type": "roundrobin",
"nodes": {
"127.0.0.1:1982":1
}
},
"weight": 3
}
]
}
]
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:1980": 1
}
}
}'
```

**Test plugin:**

The request header `x-api-id` is equal to 1, which hits the upstream of the 1981 port.

```shell
$ curl http://127.0.0.1:9080/hello -H 'x-api-id: 1'
1981
```

The request header `x-api-id` is equal to 2, which hits the upstream of the 1982 port.

```shell
$ curl http://127.0.0.1:9080/hello -H 'x-api-id: 2'
1982
```

The request header `x-api-id` is equal to 3, the rule does not match, and it hits the upstream of the 1980 port.

```shell
$ curl http://127.0.0.1:9080/hello -H 'x-api-id: 3'
1980
```

## Disable Plugin

When you want to remove the traffic-split plugin, it's very simple, just delete the corresponding json configuration in the plugin configuration, no need to restart the service, it will take effect immediately:
Expand Down
93 changes: 93 additions & 0 deletions docs/zh/latest/plugins/traffic-split.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ title: traffic-split
- [灰度发布](#灰度发布)
- [蓝绿发布](#蓝绿发布)
- [自定义发布](#自定义发布)
- [匹配规则与上游对应](#匹配规则与上游对应)
- [禁用插件](#禁用插件)

## 名字
Expand Down Expand Up @@ -493,6 +494,98 @@ Content-Type: text/html; charset=utf-8
hello 1980
```

### 匹配规则与上游对应

如何让不同的匹配规则对应到不同的上游,我们可以通过配置多个 `rules.match` + `rules.weighted_upstreams` 来实现。

**示例:**

当请求头 `x-api-id` 等于 1 时,命中 1981 端口的上游;当 `x-api-id` 等于 2 时,命中 1982 端口的上游;否则,命中 1980 端口的上游(上游响应数据为对应的端口号)。

```shell
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/hello",
"plugins": {
"traffic-split": {
"rules": [
{
"match": [
{
"vars": [
["http_x-api-id","==","1"]
]
}
],
"weighted_upstreams": [
{
"upstream": {
"name": "upstream-A",
"type": "roundrobin",
"nodes": {
"127.0.0.1:1981":1
}
},
"weight": 3
}
]
},
{
"match": [
{
"vars": [
["http_x-api-id","==","2"]
]
}
],
"weighted_upstreams": [
{
"upstream": {
"name": "upstream-B",
"type": "roundrobin",
"nodes": {
"127.0.0.1:1982":1
}
},
"weight": 3
}
]
}
]
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:1980": 1
}
}
}'
```

**测试插件:**

请求头 `x-api-id` 等于 1,命中 1981 端口的上游。

```shell
$ curl http://127.0.0.1:9080/hello -H 'x-api-id: 1'
1981
```

请求头 `x-api-id` 等于 2,命中 1982 端口的上游。

```shell
$ curl http://127.0.0.1:9080/hello -H 'x-api-id: 2'
1982
```

请求头 `x-api-id` 等于 3,规则不匹配,命中 1980 端口的上游。

```shell
$ curl http://127.0.0.1:9080/hello -H 'x-api-id: 3'
1980
```

## 禁用插件

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