1. 程式人生 > >基於cookie在nginx實現業務灰度發布

基於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實現業務灰度發布