江苏不朽情缘一直高度重视技术立异,大力推动焦点技术研发,为更多客户提供基于自身焦点竞争力的企业级数据宁静产品。
本文主要关注灰度宣布中的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