灰度發(fā)布方案

灰度發(fā)布(又名金絲雀發(fā)布)是指在黑與白之間订雾,能夠平滑過渡的一種發(fā)布方式肢预。在其上可以進行A/B testing,即讓一部分用戶繼續(xù)用產(chǎn)品特性A洼哎,一部分用戶開始用產(chǎn)品特性B烫映,如果用戶對B沒有什么反對意見,那么逐步擴大范圍噩峦,把所有用戶都遷移到B 上面來锭沟。灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定识补,在初始灰度的時候就可以發(fā)現(xiàn)族淮、調(diào)整問題,以保證其影響度凭涂。

二祝辣、實現(xiàn)思路方向

1、在代碼中做切油。

一套線上環(huán)境蝙斜,代碼中做開關,對于不同的用戶走不同的邏輯

2澎胡、在接入層做孕荠。

多套(隔離的)線上環(huán)境,接入層針對不同用戶轉發(fā)到不同的環(huán)境中

兩種方案的優(yōu)缺點:

方案優(yōu)點缺點

在代碼中做靈活攻谁,粒度細稚伍;一套代碼(環(huán)境)運維成本低灰度邏輯侵入代碼

在接入層做無需(少)侵入代碼;風險小多套線上環(huán)境巢株,運維成本高


靈活的灰度方案一般需要在接入層實現(xiàn)槐瑞,具體就是自定義負載均衡策略實現(xiàn)熙涤。

下面介紹在接入層使用的方式阁苞,第一是在nginx層實現(xiàn)(使用ngx+lua)困檩,第二是在網(wǎng)關層實現(xiàn)(spring-cloud-zuul)。

第三是dubbo的灰度那槽,項目中如果使用dubbo悼沿,有可能會需要dubbo服務的灰度實現(xiàn)。

負載均衡又可分為服務端負載均衡和客戶端負載均衡

服務器端負載均衡:例如Nginx骚灸,通過Nginx進行負載均衡糟趾,先發(fā)送請求,然后通過負載均衡算法甚牲,在多個服務器之間選擇一個進行訪問义郑;即在服務器端再進行負載均衡算法分配。

客戶端負載均衡:例如ribbon或者dubbo丈钙,客戶端會有一個服務器地址列表非驮,在發(fā)送請求前通過負載均衡算法選擇一個服務器,然后進行訪問雏赦,這是客戶端負載均衡劫笙;即在客戶端就進行負載均衡算法分配。


三星岗、nginx灰度方案說明

Nginx是一款輕量級的Web服務器/反向代理服務器以及電子郵件代理服務器填大。

nginx.cof

負載均衡策略:輪詢(默認)、weight俏橘、ip_hash允华、fair(響應時間)、url_hash


簡單的根據(jù)cookie進行灰度

Openresty

Nginx有很多的特性和好處寥掐,但是在Nginx上開發(fā)成了一個難題例获,Nginx模塊需要用C開發(fā),而且必須符合一系列復雜的規(guī)則曹仗,最重要的用C開發(fā)模塊 必須要熟悉Nginx的源代碼榨汤,使得開發(fā)者對其望而生畏。為了開發(fā)人員方便怎茫,所以接下來我們要介紹一種整合了Nginx和lua的框架收壕,那就是OpenResty。

OpenResty??是一個基于?Nginx?與 Lua 的高性能 Web 平臺轨蛤,其內(nèi)部集成了大量精良的 Lua 庫蜜宪、第三方模塊以及大多數(shù)的依賴項。用于方便地搭建能夠處理超高并發(fā)祥山、擴展性極高的動態(tài) Web 應用圃验、Web 服務和動態(tài)網(wǎng)關。

?Openresty學習地址:https://moonbingbing.gitbooks.io/openresty-best-practices/content/base/intro.html

新浪微博開源項目

git地址:https://github.com/CNSRE/ABTestingGateway

ABTestingGateway是一個可以動態(tài)設置分流策略的灰度發(fā)布系統(tǒng)缝呕,工作在7層澳窑,基于nginx和ngx-lua開發(fā)斧散,使用 redis 作為分流策略數(shù)據(jù)庫,可以實現(xiàn)動態(tài)調(diào)度功能摊聋。

ABTestingGateway是在 nginx 轉發(fā)的框架內(nèi)鸡捐,在轉向 upstream 前,根據(jù) 用戶請求特征 和 系統(tǒng)的分流策略 麻裁,查找出目標upstream箍镜,進而實現(xiàn)分流。

nginx實現(xiàn)的灰度系統(tǒng)中煎源,分流邏輯往往通過 rewrite 階段的 if 和rewrite 指令等實現(xiàn)色迂,優(yōu)點是性能較高,缺點是功能受限手销、容易出錯脚草,以及轉發(fā)規(guī)則固定,只能靜態(tài)分流原献。針對這些缺點馏慨, ABTestingGateway,采用ngx-lua 實現(xiàn)系統(tǒng)功能姑隅,通過啟用lua-shared-dictlua-resty-lock作為系統(tǒng)緩存和緩存鎖写隶,系統(tǒng)獲得了較為接近原生nginx轉發(fā)的性能竿奏。

架構圖:

特性:

實現(xiàn)原理:在代理轉發(fā)前荆几,使用rewrite_by_lua_file模塊重寫到目標upstream

diversion.lua邏輯:

例:略

四庙洼、dubbo灰度方案說明

Dubbo架構

?? Dubbo服務調(diào)用過程

Loadbalance(負載均衡)說明

在集群負載均衡時荆忍,Dubbo 提供了多種均衡策略,缺省為?random?隨機調(diào)用

負載均衡策略Random(隨機)沮协、RoundRobin(輪詢)住册、LeastActive(最小活躍調(diào)用數(shù))牢屋、ConsistentHash(一致性Hash)

負載均衡配置:

自定義負載均衡實現(xiàn):

例:

實現(xiàn)LoadBalance接口趁矾,或者繼承AbstractLoadBalance?重寫策略耙册;


根據(jù)dubbo SPI發(fā)現(xiàn)機制,還需要在resources下添加META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance

demo邏輯:目標服務的端口和灰度服務端口的一致毫捣,并且請求方法的第一個參數(shù)類型是Long(userId)并且是灰度用戶详拙,則判斷為灰度服務,否則按照默認隨機調(diào)用其余非灰度服務


四蔓同、springCloud灰度方案說明

?? Ribbon 提供了幾個負載均衡的組件饶辙,其目的就是讓請求轉給合適的服務器處理

默認輪詢

自定義策略需要繼承AbstractLoadBalancerRule

開源方案:

自定義DiscoveryEnabledRule繼承PredicateBaseRule

首先在請求開始處,實現(xiàn)自己的灰度邏輯斑粱,比如下面的demo根據(jù)請求url如果包含‘version’向holder中添加route為A的標識弃揽,否則添加route為B的標識。 ?(Holder本質是一個localThread)

在目標服務添加matadateMap

PredicateBaseRule中使用google提供的pridicate,MetadataAwarePredicate中實現(xiàn)apply方法判斷發(fā)現(xiàn)的服務是否是目標服務

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矿微,一起剝皮案震驚了整個濱河市痕慢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌冷冗,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惑艇,死亡現(xiàn)場離奇詭異蒿辙,居然都是意外死亡,警方通過查閱死者的電腦和手機滨巴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門思灌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恭取,你說我怎么就攤上這事泰偿。” “怎么了蜈垮?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵耗跛,是天一觀的道長。 經(jīng)常有香客問我攒发,道長调塌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任惠猿,我火速辦了婚禮羔砾,結果婚禮上,老公的妹妹穿的比我還像新娘偶妖。我一直安慰自己姜凄,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布趾访。 她就那樣靜靜地躺著态秧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扼鞋。 梳的紋絲不亂的頭發(fā)上屿聋,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音藏鹊,去河邊找鬼润讥。 笑死,一個胖子當著我的面吹牛盘寡,可吹牛的內(nèi)容都是我干的楚殿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼脆粥!你這毒婦竟也來了砌溺?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤变隔,失蹤者是張志新(化名)和其女友劉穎规伐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匣缘,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡猖闪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肌厨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片培慌。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖柑爸,靈堂內(nèi)的尸體忽然破棺而出吵护,到底是詐尸還是另有隱情,我是刑警寧澤表鳍,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布馅而,位于F島的核電站,受9級特大地震影響譬圣,放射性物質發(fā)生泄漏用爪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一胁镐、第九天 我趴在偏房一處隱蔽的房頂上張望偎血。 院中可真熱鬧,春花似錦盯漂、人聲如沸颇玷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帖渠。三九已至,卻和暖如春竭宰,著一層夾襖步出監(jiān)牢的瞬間空郊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工切揭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狞甚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓廓旬,卻偏偏與公主長得像哼审,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容