> Because many technical problems in the current `dynamic-upstream` plugin have been solved
Please provide a comparison of strengths and weaknesses, we need more details Yuelin Zheng <[email protected]>于2020年11月7日 周六上午11:44写道: > Hi,WenMing, > > Yes, this is what we need to consider. I think the plug-in approach is > feasible. Because many technical problems in the current `dynamic-upstream` > plugin have been solved. > > We can try to implement this plugin. > > > At 2020-11-03 22:44:54, "Ming Wen" <[email protected]> wrote: > >Hi, yuelin, > >I don’t think the hypothetical result is a convincing reason. > >We need a comparison of technical solutions. > > > >Thanks, > >Ming Wen, Apache APISIX & Apache SkyWalking > >Twitter: _WenMing > > > > > >Yuelin Zheng <[email protected]> 于2020年11月3日周二 下午9:44写道: > > > >> I think plugin implementation is also a good way. If implemented through > >> existing routing rules, > >> it is difficult for people who are not familiar with apisix to find this > >> feature. > >> > >> > >> > >> > >> > >> At 2020-11-01 16:07:21, "Zhang Chao" <[email protected]> wrote: > >> > Hi! > >> > > >> >Actually we already have a discuss about this feature in this mailing > >> list, > >> >see > >> > > >> > https://lists.apache.org/thread.html/r9222f87b69bbb8cf9dce1f5e920adb6aede38f4c24bc1b0dac07b53f%40%3Cdev.apisix.apache.org%3E > >> >for > >> >the details. > >> > > >> >From my point of view, it’s better to implement the first class > support of > >> >traffic split/shift by APISIX instead of by a plugin, since the match > part > >> >is highly consistent with Route, and Route already handles the related > >> >logics like health check, service discovery around Upstream well. On > the > >> >contrary, introducing another Plugin which references to Upstream need > to > >> >consider these problems once again. > >> > > >> >So what about considering the way in the above mentioned link? :) > >> > > >> >On November 1, 2020 at 12:00:47 AM, Yuelin Zheng ([email protected]) > wrote: > >> > > >> >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? > >> > -- Thanks, Ming Wen, Apache APISIX & Apache SkyWalking Twitter: _WenMing
