You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apisix.apache.org by codjust <hc...@foxmail.com> on 2019/12/29 14:50:45 UTC

回复: [DISCUSS] chash key support more flexible ways

I will submit a PR later, please review it together.


------------------&nbsp;原始邮件&nbsp;------------------
发件人:&nbsp;"Ming Wen"<wenming@apache.org&gt;;
发送时间:&nbsp;2019年12月24日(星期二) 上午8:10
收件人:&nbsp;"dev"<dev@apisix.apache.org&gt;;

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



&gt;
&gt; I do think we can learn this part from OpenResty Edge,
&gt;
This is the part of the dashboard display.

I was wondering if the underlying code implementation needed a
classification as codjust said? Or just sort on the dashboard?

Thanks,
Ming Wen, Apache APISIX
Twitter: _WenMing


李凌 <lilien1010@gmail.com&gt; 于2019年12月23日周一 下午10:56写道:

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

Re: [DISCUSS] chash key support more flexible ways

Posted by Ming Wen <we...@apache.org>.
Hi, codjust,
good job, I will review this PR :)

Thanks,
Ming Wen, Apache APISIX
Twitter: _WenMing


codjust <hc...@foxmail.com> 于2020年1月5日周日 下午10:25写道:

> PR is here:&nbsp;https://github.com/apache/incubator-apisix/pull/1022
> welcome to review it together.
> thx.
>
>
> regards,
> codjust
>
> ------------------&nbsp;原始邮件&nbsp;------------------
> 发件人:&nbsp;"Ming Wen"<wenming@apache.org&gt;;
> 发送时间:&nbsp;2019年12月30日(星期一) 上午8:26
> 收件人:&nbsp;"dev"<dev@apisix.apache.org&gt;;
>
> 主题:&nbsp;Re: [DISCUSS] chash key support more flexible ways
>
>
>
> cool, look forward to it.
>
> Thanks,
> Ming Wen, Apache APISIX
> Twitter: _WenMing
>
>
> codjust <hcw1003@foxmail.com&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"<wenming@apache.org&amp;gt;;
> &gt; 发送时间:&amp;nbsp;2019年12月24日(星期二) 上午8:10
> &gt; 收件人:&amp;nbsp;"dev"<dev@apisix.apache.org&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; 李凌 <lilien1010@gmail.com&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 <wenming@apache.org&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 <wenming@apache.org&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
> <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 <hcw1003@foxmail.com&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 <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;

回复: [DISCUSS] chash key support more flexible ways

Posted by codjust <hc...@foxmail.com>.
PR is here:&nbsp;https://github.com/apache/incubator-apisix/pull/1022
welcome to review it together.
thx.


regards,
codjust

------------------&nbsp;原始邮件&nbsp;------------------
发件人:&nbsp;"Ming Wen"<wenming@apache.org&gt;;
发送时间:&nbsp;2019年12月30日(星期一) 上午8:26
收件人:&nbsp;"dev"<dev@apisix.apache.org&gt;;

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



cool, look forward to it.

Thanks,
Ming Wen, Apache APISIX
Twitter: _WenMing


codjust <hcw1003@foxmail.com&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"<wenming@apache.org&amp;gt;;
&gt; 发送时间:&amp;nbsp;2019年12月24日(星期二) 上午8:10
&gt; 收件人:&amp;nbsp;"dev"<dev@apisix.apache.org&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; 李凌 <lilien1010@gmail.com&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 <wenming@apache.org&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 <wenming@apache.org&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 <hcw1003@foxmail.com&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;

Re: [DISCUSS] chash key support more flexible ways

Posted by Ming Wen <we...@apache.org>.
cool, look forward to it.

Thanks,
Ming Wen, Apache APISIX
Twitter: _WenMing


codjust <hc...@foxmail.com> 于2019年12月29日周日 下午10:51写道:

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