PR is here: https://github.com/apache/incubator-apisix/pull/1022
welcome to review it together.
thx.


regards,
codjust

------------------ ???????? ------------------
??????:&nbsp;"Ming Wen"<[email protected]&gt;;
????????:&nbsp;2019??12??30??(??????) ????8:26
??????:&nbsp;"dev"<[email protected]&gt;;

????:&nbsp;Re: [DISCUSS] chash key support more flexible ways



cool, look forward to it.

Thanks,
Ming Wen, Apache APISIX
Twitter: _WenMing


codjust <[email protected]&gt; ??2019??12??29?????? ????10:51??????

&gt; I will submit a PR later, please review it together.
&gt;
&gt;
&gt; ------------------&amp;nbsp;????????&amp;nbsp;------------------
&gt; ??????:&amp;nbsp;"Ming Wen"<[email protected]&amp;gt;;
&gt; ????????:&amp;nbsp;2019??12??24??(??????) ????8:10
&gt; ??????:&amp;nbsp;"dev"<[email protected]&amp;gt;;
&gt;
&gt; ????:&amp;nbsp;Re: [DISCUSS] chash key support more flexible ways
&gt;
&gt;
&gt;
&gt; &amp;gt;
&gt; &amp;gt; I do think we can learn this part from OpenResty Edge,
&gt; &amp;gt;
&gt; This is the part of the dashboard display.
&gt;
&gt; I was wondering if the underlying code implementation needed a
&gt; classification as codjust said? Or just sort on the dashboard?
&gt;
&gt; Thanks,
&gt; Ming Wen, Apache APISIX
&gt; Twitter: _WenMing
&gt;
&gt;
&gt; ???? <[email protected]&amp;gt; ??2019??12??23?????? ????10:56??????
&gt;
&gt; &amp;gt; I do think we can learn this part from OpenResty Edge,
&gt; &amp;gt; also I like the idea that take a Chash key from Header ,which is
&gt; pretty
&gt; &amp;gt; meaningful for us.
&gt; &amp;gt;
&gt; &amp;gt; [image: image.png]
&gt; &amp;gt;
&gt; &amp;gt;
&gt; &amp;gt; Ming Wen <[email protected]&amp;gt; ??2019??12??23?????? 
????9:04??????
&gt; &amp;gt;
&gt; &amp;gt;&amp;gt; yuansheng, what do you think?
&gt; &amp;gt;&amp;gt;
&gt; &amp;gt;&amp;gt; Thanks,
&gt; &amp;gt;&amp;gt; Ming Wen, Apache APISIX
&gt; &amp;gt;&amp;gt; Twitter: _WenMing
&gt; &amp;gt;&amp;gt;
&gt; &amp;gt;&amp;gt;
&gt; &amp;gt;&amp;gt; Ming Wen <[email protected]&amp;gt; ??2019??12??23?????? 
????9:03??????
&gt; &amp;gt;&amp;gt;
&gt; &amp;gt;&amp;gt; &amp;gt; hi, codjust,
&gt; &amp;gt;&amp;gt; &amp;gt; I prefer your design than the existing one[1].
&gt; &amp;gt;&amp;gt; &amp;gt;
&gt; &amp;gt;&amp;gt; &amp;gt; These categories "vars", "header", "cookie", 
"consumer" are
&gt; friendly for
&gt; &amp;gt;&amp;gt; &amp;gt; developer.
&gt; &amp;gt;&amp;gt; &amp;gt;
&gt; &amp;gt;&amp;gt; &amp;gt; [1]
&gt; &amp;gt;&amp;gt; &amp;gt;
&gt; &amp;gt;&amp;gt;
&gt; 
https://github.com/apache/incubator-apisix/blob/master/lua/apisix/schema_def.lua#L261
&gt; &amp;gt;&amp;gt
&gt; 
<https://github.com/apache/incubator-apisix/blob/master/lua/apisix/schema_def.lua#L261&amp;gt;&amp;gt&gt;;
&gt; &amp;gt;
&gt; &amp;gt;&amp;gt; &amp;gt; Thanks,
&gt; &amp;gt;&amp;gt; &amp;gt; Ming Wen, Apache APISIX
&gt; &amp;gt;&amp;gt; &amp;gt; Twitter: _WenMing
&gt; &amp;gt;&amp;gt; &amp;gt;
&gt; &amp;gt;&amp;gt; &amp;gt;
&gt; &amp;gt;&amp;gt; &amp;gt; codjust <[email protected]&amp;gt; 
??2019??12??23?????? ????8:58??????
&gt; &amp;gt;&amp;gt; &amp;gt;
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; Now chash key only support fetch from 
nginx variable. We
&gt; need to be
&gt; &amp;gt;&amp;gt; more
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; flexible approach??
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; eg: cookie, custom header and so on.
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; Here is an example to achieve:
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; upstream json schema??
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; hash_on = {
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp;
&gt; &amp;amp;nbsp; type = "string",
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp;
&gt; &amp;amp;nbsp; default = "vars",
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp;
&gt; &amp;amp;nbsp; enum = {
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp;
&gt; &amp;amp;nbsp; &amp;amp;nbsp; "vars",
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp;
&gt; &amp;amp;nbsp; &amp;amp;nbsp; "header",
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp;
&gt; &amp;amp;nbsp; &amp;amp;nbsp; "cookie",
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp;
&gt; &amp;amp;nbsp; &amp;amp;nbsp; "consumer"
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp;
&gt; &amp;amp;nbsp; },
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; },
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; key = {
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp;
&gt; &amp;amp;nbsp; description = "the key of
&gt; &amp;gt;&amp;gt; chash
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; for dynamic load balancing",
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp;
&gt; &amp;amp;nbsp; type = "string"
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; },
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; eg:
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; local function 
create_chash_hash_key(ctx, upstream)
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; local key 
= upstream.key&amp;amp;nbsp;
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; local 
hash_on = upstream.hash_on
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; local 
chash_key
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; -- from 
nginx variable
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; if hash_on 
== "vars" then&amp;amp;nbsp;
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; chash_key =
&gt; ctx.var[key]
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; elseif 
hash_on == "header"
&gt; then&amp;amp;nbsp;
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; chash_key =
&gt; ngx.req.get_headers()[key]
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; elseif 
hash_on == "cookie"
&gt; then&amp;amp;nbsp;
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; chash_key =
&gt; ctx.var["cookie_" .. key]
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; -- TODO
&gt; chash_key doesn't exist, set-cookie
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; end
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; if not 
chash_key then&amp;amp;nbsp;
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; 
&amp;amp;nbsp; &amp;amp;nbsp; chash_key =
&gt; ctx.var["remote_addr"]
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; end
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; &amp;amp;nbsp; &amp;amp;nbsp; return 
chash_key
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; end
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; hash_on type desc:
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; 1 vars: fetchs nginx variable
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; 2 header: custom headers or standard 
http headers
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; 3 cookie: fetch chash key from cookie. 
It can be used to
&gt; sticky session
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; 4 consumer: hash by consumer_id
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; If the specified chash key is not 
present, use default
&gt; key:
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; remote_addr(it can also provide default 
settings).
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; everybody have a better idea?
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; github issue:
&gt; &amp;gt;&amp;gt; &amp;gt;&amp;gt; 
https://github.com/apache/incubator-apisix/issues/992
&gt; &amp;gt;&amp;gt 
<https://github.com/apache/incubator-apisix/issues/992&amp;gt;&amp;gt&gt;;
&gt; &amp;gt;
&gt; &amp;gt;&amp;gt; &amp;gt;
&gt; &amp;gt;&amp;gt;
&gt; &amp;gt;

Reply via email to