服务器灰度部署和原理

最近参与了开发了几个新项目,其实每次上新项目的时候,都会发出感慨:搞新项目中最难的其实都不是写代码,而是部署环境,因为每次部署环境都会遇到各种各样的环境问题,比如代码更上去后不生效、请求打不到机器上、调用数据库连接、内网接口等访问不通、灰度配置不生效等问题,所以每次都要和运维老哥一起掰扯好几天。好了,言归正传,今天就跟大家聊下我司新服务的灰度配置规则和原理。

1、灰度概念和访问灰度流程:

首先先讲解下我司灰度发布的概念:在同一个现网域名和路由下(以下篇幅用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 …来表示灰度代码存放目录)。访问灰度流程图大概如下所示:

灰度代码访问流程

2、灰度实现原理:

灰度实现的原理总结起来就是三件套 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就可以访问到对应的代码了。

3、总结:

以上,就是我公司的灰度配置的一些流程和关键代码了。当然,有的公司还会根据不同的域名来区分灰度代码和现网代码,或者根据不同的客户端访问ip做反向代理区分灰度,或者代码里面做灰度逻辑等方式。这些方式也都是可行的,没有最好的,只有最适合的。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值