+1 agree LGTM Yuelin Zheng <[email protected]> 于2020年11月1日周日 上午12:00写道:
> Hi, Community, > > > I have implemented a plug-in related to traffic split, and I want to add > the plug-in to apisix. The following is the main information of the plugin: > > > 1. Background > > > After seeing this issue about traffic split plugin #2303( > https://github.com/apache/apisix/issues/2303), I think this function is > very useful, it can effectively realize the flow control function. > Therefore, this inspired me to implement a dynamic upstream plugin. > > > 2. Why do this > For details, please see: https://github.com/apache/apisix/issues/2303 > Traffic split means that requests need to comply with certain rules in > order to reach the designated upstream or a certain node in the upstream. > Through this function, gray release, blue-green release and custom routing > are realized, which is very useful for reducing downtime in the event of a > failure. > > > 3. Design > The dynamic upstream plug-in is mainly composed of two parts `match` and > `upstreams` to implement the rules of the plugin. `match` is the matching > rule of the plugin (the currently supported operations are: ==, ~=, ~~, >, > >=, <, <=, in , ip_in). Only after the `match` rule is passed, can the > `upstreams` rule in the plugin be reached, otherwise the default upstream > is reached. In the `upstreams` rule, `upstream` is the configuration of the > plugin upstream, and the `weight` field is the basis for traffic > segmentation between upstream services (using the roundrobin algorithm). > > > note: > ``` > { > "Weight": 1 > } > ``` > When the plug-in upstream configuration has only the weight field, it > means the default upstream traffic ratio. > > > Example: > > > Grayscale release: > The traffic is split according to the weight field value configured in the > upstreams part of the plug-in. > If `match` is not configured, match is passed by default. Divide the > request traffic by 4:1, 4/5 of the traffic hits the upstream of the plugin > port of `1981`, and 1/5 of the traffic hits the default upstream of the > `1980` port. > > > ``` > "plugins": { > "dynamic-upstream": { > "rules": [ > { > "upstreams": [ > { > "upstream": { > "name": "upstream_A", > "type": "roundrobin", > "nodes": { > "127.0.0.1:1981":10 > } > }, > "weight": 4 > }, > { > > "weight": 1 > } > > ] > } > ] > } > }, > "upstream": { > "type": "roundrobin", > "nodes": { > "127.0.0.1:1980": 1 > } > } > ``` > > > Blue-green release: > All requests hit the upstrean configured by the plugin (when weight is 0, > the corresponding upstream is invalid). > > > ``` > "plugins": { > "dynamic-upstream": { > "rules": [ > { > "match": [ > { > "vars": [ > [ "http_new-release","==","blue" ] > ] > } > ], > "upstreams": [ > { > "upstream": { > "name": "upstream_A", > "type": "roundrobin", > "nodes": { > "127.0.0.1:1981":10 > } > }, > "weight": 1 > }, > { > > "weight": 0 > } > > ] > } > ] > } > }, > "upstream": { > "type": "roundrobin", > "nodes": { > "127.0.0.1:1980": 1 > } > } > ``` > > > Custom release: > There are multiple conditions in vars, and the relationship between them > is `add`. Multiple vars can be configured, then they have an `or` > relationship. > After the `match` rule is passed, the traffic is divided into 4:2, 2/3 of > the traffic hits the plug-in upstream of the `1981` port, and 1/3 of the > traffic hits the default upstream of the `1980` port. > > > ``` > "plugins": { > "dynamic-upstream": { > "rules": [ > { > "match": [ > { > "vars": [ > [ "arg_name","==","jack" ], > [ "http_user-id",">=","23" ], > [ "http_apisix-key","~~","[a-z]+" ] > ] > } > ], > "upstreams": [ > { > "upstream": { > "name": "upstream_A", > "type": "roundrobin", > "nodes": { > "127.0.0.1:1981":10 > } > }, > "weight": 4 > }, > { > > “weight”: 2 > > } > > ] > } > ] > } > }, > "upstream": { > "type": "roundrobin", > "nodes": { > "127.0.0.1:1980": 1 > } > } > ``` > > > Note: The vars parameter here can be obtained from the http request > header, querystring or nginx variable. > The above is a brief introduction to the dynamic upstream plugin. > > > I want to add this plugin to the apisix project, what do you think? > > > > > > > > > > >
