最近参与了开发了几个新项目,其实每次上新项目的时候,都会发出感慨:搞新项目中最难的其实都不是写代码,而是部署环境,因为每次部署环境都会遇到各种各样的环境问题,比如代码更上去后不生效、请求打不到机器上、调用数据库连接、内网接口等访问不通、灰度配置不生效等问题,所以每次都要和运维老哥一起掰扯好几天。好了,言归正传,今天就跟大家聊下我司新服务的灰度配置规则和原理。
首先先讲解下我司灰度发布的概念:在同一个现网域名和路由下(以下篇幅用http://lmzlovego.com/test_gray 来举例), 通过在浏览器的cookie里面设置不同的shop_id值,例如shop_id = shopxxx0001、shop_id = shopxxx0002、shop_id = shopxxx0003,来控制请求打到现网服务器的不同目录(以下篇幅用love_go_prod 表示现网代码存放目录,用love_go_gray1、love_go_gray2、love_go_gray3 …来表示灰度代码存放目录)。访问灰度流程图大概如下所示:
灰度实现的原理总结起来就是三件套 nginx+lua+cookie,下面跟大家详细讲解下其关键配置:
(1)首先在nginx.conf 中引入load_gray.lua文件
-- 获取cookie中的shop_id
function load_gray_conf.get_shop_id()
shop_id = ngx.var["cookie_shop_id"]
if nil ~= shop_id then
return shop_id
end
(2)lua文件中配置灰度目录和灰度名单
-- 加载灰度名单函数,sys_name: 系统名称,path: 配置文件的相对路径
function load_list(sys_name, path)
local gray_list = ngx.shared.gray_list
local prefix = "/etc/nginx/conf/lua/shop_id_list/";
local sys_shop_ids = dofile(prefix .. path)
for branch, shop_ids in pairs(sys_shop_ids) do
for i, shop_id in pairs(shop_ids) do
-- 将 shop_id 转换为小写
shop_id = string.lower(shop_id)
gray_list:set(sys_name .. ":" .. shop_id, branch)
end
end
end
-- 加载灰度目录函数,sys_name: 系统名称,path: 配置文件的相对路径
function load_dir(sys_name, config_fp)
local gray_list = ngx.shared.gray_list
local prefix = "/etc/nginx/conf/lua/dir_list/";
local gray_dirs = dofile(prefix .. config_fp)
for branch, path in pairs(gray_dirs) do
gray_list:set(sys_name .. ":root_dir:" .. branch, path)
end
end
(3)/etc/nginx/conf/lua/dir_list/ 目录下和/etc/nginx/conf/lua/shop_id_list/目录下加载具体的项目目录和shop_id对应的灰度规则:
/etc/nginx/conf/lua/dir_list/目录下存放 love_go.lua文件,文件保存下面的配置:
-- 表示 love_go_gray1、love_go_gray2、love_go_gray3目录对应的灰度标识是 love_go_gray1、love_go_gray2、love_go_gray3
-- key是灰度标识,value是目录
local config = {
love_go_gray1="love_go_gray1",
love_go_gray2="love_go_gray2",
love_go_gray3="love_go_gray3",
}
return config
(4)/etc/nginx/conf/lua/shop_id_list/目录下存放love_go.lua文件,文件保存下面的配置:
-- 表示 love_go_gray1、love_go_gray2、love_go_gray3灰度标识可以使用shopxxx0001、shopxxx0002、shopxxx0003等不同的cookie值访问到不同的目录
local config = {
love_go_gray1={"shopxxx0001"},
love_go_gray2={"shopxxx0002"},
love_go_gray3={"shopxxx0003"},
}
return config
(5)最后,在浏览器上加上cookie 值 shop_id = shopxxx0001、shop_id = shopxxx0002、shop_id = shopxxx0003就可以访问到对应的代码了。
以上,就是我公司的灰度配置的一些流程和关键代码了。当然,有的公司还会根据不同的域名来区分灰度代码和现网代码,或者根据不同的客户端访问ip做反向代理区分灰度,或者代码里面做灰度逻辑等方式。这些方式也都是可行的,没有最好的,只有最适合的。