基於cookie在nginx實現業務灰度發布
基於cookie在nginx實現業務灰度發布
背景
灰度發布是指在黑與白之間,能夠平滑過渡的一種發布方式。
灰度發布可以保證整體系統的穩定,
在初始灰度的時候就可以發現、調整問題,以保證其影響度。
業務存在灰度發布的需求,
可以通過nginx+lua形式實現業務的灰度發布,
目前這一形式已在廣平互動廣告相關業務已經實現。
流程
用戶使用帳號登錄後,判斷用戶帳號是否在灰度發布的名單中,如果再則給用戶的cookie中增加灰度發布標識,然後刷新頁面。
當用戶訪問頁面時,業務接入層的nginx方向代理會根據用戶cookie是否帶著灰度標識而對用戶的請求進行選擇,是轉發到所有後端機器還是指定的灰度發布機器。
方案
業務維護一個用戶帳號的灰度名單,在程序裏面實現灰度帳號登錄時cookie裏面種相應的標識。
用戶請求發起時,nginx反向代理接入層通過獲取請求中帶的cookie的相關變量來判斷當前請求是發往全量的服務器,還是發往灰度的服務器。
灰度處理邏輯
nginx接入層
配置實例
nginx配置靜態頁面的灰度規則
server
{
listen 80;
server_name test.qunyingliu.qq.com;
access_log logs/test.qunyingliu.qq.com.access.log access;
設置默認為全量發布
set $group "Full";
判斷cookie中是否有灰度標識號
if ($http_cookie ~* "FC_GREY=1"){
set $group Grey;
}
location / {
proxy_pass http://$group;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
}
}
nginx配置PHP頁面的灰度規則
location @grey {
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
add_header ENV ‘grey‘;
proxy_pass http://Grey;
}
location @full {
proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header;
add_header ENV ‘full‘;
proxy_pass http://FULL;
}
location ~ \.(php)?$ {
content_by_lua_file "conf/lua/test.qunyingliu.qq.com.lua";
}
test.qunyingliu.qq.com.lua:
local ck = require "resty.cookie"
local grey_cookie_key = "FC_GREY"
local cookie, err = ck:new()
if not cookie then
ngx.exec("@full")
else
local field, err = cookie:get(grey_cookie_key)
if not field then
ngx.exec("@full")
else
ngx.exec("@grey")
end
end
灰度驗證
1.瀏覽器控制臺設置灰度cookie
console---> setCookie(‘FC_GREY‘,1)
2.chrome擴展:EditThisCookie--->"+"---->添加新cookie
3.業務裏面給用戶設置cookie
總結
需要業務端配合才能實現自動的灰度發布,
主要規則是在nginx上使用lua腳本進行處理,
請求的速度和穩定性可能會收到lua腳本處理的影響,
界面普遍認為nginx+lua是非常好的搭配,
相關開源方案OpenResty也是比較熱門的,
實際效果還需要在業務上線後進行驗證。
本文出自 “運維者說:從菜鳥到老鳥” 博客,請務必保留此出處http://liuqunying.blog.51cto.com/3984207/1925463
基於cookie在nginx實現業務灰度發布