江苏尊龙凯时人生就是搏一直高度重视手艺立异,鼎力大举推动焦点手艺研发,为更多客户提供基于自身焦点竞争力的企业级数据清静产品。
本文主要关注灰度宣布中的Web前端灰度的分流战略。
现在主流的架构是前后端疏散架构,前端主要接纳Nginx举行宣布。关于前端的流量切换和分流也很成熟,本文先容几种常见的分流规则战略,并用Nginx的语法来演示设置实现。
灰度宣布的划分
若是凭证宣布端来分的话,灰度宣布可以分为Web前端灰度、客户端灰度和效劳端灰度几种。
无论是哪种灰度计划,一样平常都需要知足以下2个要求:
一个要求是流量分流逐步切换的设置,给产品职员、运营或运维等事情职员设置这个战略。
另一个要求是统一个用户始终会见的是统一个版本的代码对应的系统。
基于URL分流
基于URL分流的原理是让Nginx凭证请求URL的差别,进而将请求转发到差别的效劳器上。
例如:
url http://192.168.2.200/login/0001/
url http://192.168.2.200/login/0002/
需求是将登录请求后缀为0001的用户请求转发到灰度效劳器上,将登录请求后缀为0002的用户请求转发到生产效劳器上。
演示代码如下:
map $zone $up_stream {
^~0001 frontends_0001;
^~0002 frontends_0002;
default frontends_0001;
}
基于COOKIE分流
基于Cookie分流的原理为:在用户首次登录时盘问该用户是否是灰度用户,并为其设置标识Cookie,后续接纳Cookie标识来举行分流。
本文接纳gray字段作为标识,若是cookie中gray的值为true则分流到灰度情形,其他情形则分流到生产情形。
实现代码如下:
upstream normal {
server 192.168.2.200:9000;
}
upstream tag {
server 192.168.2.200:9001;
}
server {
listen 8080;
server_name host_nginx;
set $group normal;
if ($http_cookie ~* "gray=true"){
set $group gray;
}
}
基于Header分流
基于Header分流的原理类似cookie,获取灰度标识使用的是$http_header写法。
Header不可像Cookie一样在客户端保存,以是一样平常是在多层网络中使用,即入口层给Header赋值,分流层再去分流。
实现代码如下:
map $http_tag $group {
~*true$ gray;
default normal;
基于IP分流
基于IP分流的原理是校验客户端的IP是否在尊龙凯时人生就是搏灰度IP列表中。我们可以接纳MySQL表存储需要分发到灰度情形的IP地点,若是请求IP在表中则分流到灰度情形。
在Nginx内里使用lua需要Nginx特殊增添lua-nginx-module?,在Nginx中毗连mysql的要领参考lua-resty-mysql?。
location @dark {
content_by_lua 'ngx.say("gray")';
}
location @normal {
content_by_lua 'ngx.say("normal")';
}
location /test {
access_by_lua '
local mysql = require "resty.mysql"
local db, err = mysql:new()
if not db then
xxx...
end
local ok, err, errcode, sqlstate = db:connect {
xxx...
}
if not ok then
ngx.log(ngx.ERR, "failed to connect: ", err, ": ", errcode, " ", sqlstate)
ngx.exec("@normal")
end
local req_ip = ngx.var.http_x_real_ip or ngx.var.http_x_forwarded_for or ngx.var.remote_addr or "0.0.0.0"
local name = ngx.unescape_uri(req_ip)
local quoted_name = ngx.quote_sql_str(name)
local res, err, errcode, sqlstate = db:query(var_sql)
if not res then
xxx...
end
if tonumber(res[1]["cnt"]) > 0 then
ngx.exec("@gray")
end
ngx.exec("@normal")
';
}
基于Nginx Ingress实现
Kubernetes下可以使用Nginx Ingress实现灰度宣布适用场景主要取决于营业流量切分的战略,现在Nginx Ingress支持基于Header、Cookie和效劳权重三种流量切分的战略,基于这些战略可以实现以下2种场景:
基于Header或Cookie切分部分用户流量到新版本:
基于效劳权重切分一定比例的流量到新版本:
小结
综上所述,前端灰度宣布分流的方法有许多,我们需要凭证营业的情形、手艺储备情形、营业系统的用户群等多个方面来综合思量,确定一个最适合的实现方法。
关注数据 包管未来
扫码|关注我们
微信号|江苏尊龙凯时人生就是搏
网址|http://www.bwda.net