基于nacos系統(tǒng)平滑上下線方案
所謂平滑上下線簡(jiǎn)單說(shuō)就是系統(tǒng)發(fā)版升級(jí)過(guò)程對(duì)用戶無(wú)感知呜叫,不至于等到夜深人靜的時(shí)候偷偷去搞空繁,某些請(qǐng)求時(shí)間可以長(zhǎng)點(diǎn),但不能失敗朱庆。
一盛泡、系統(tǒng)架構(gòu)介紹
? ? Springboot2.1.5 +springcloudGreentich.SR1 +naocs2.1.4
二、備選方案
? ? 方案一
? ? 基于naocs提供的SDK接口進(jìn)行服務(wù)的注銷(xiāo)|注冊(cè)
? ? 在對(duì)應(yīng)服務(wù)中新增注銷(xiāo)服務(wù)的接口代碼如下:
系統(tǒng)升級(jí)步驟:? ?
a娱颊、在系統(tǒng)升級(jí)前先調(diào)用注銷(xiāo)接口將目標(biāo)服務(wù)實(shí)例注銷(xiāo)傲诵,服務(wù)實(shí)例列表中將會(huì)刪除該實(shí)例
b、注銷(xiāo)之后將這個(gè)實(shí)例服務(wù)進(jìn)行打包部署
c箱硕、部署后拴竹,調(diào)用服務(wù)注冊(cè)接口將該服務(wù)重新注冊(cè)
d、重復(fù)a剧罩、b栓拜、c完成服務(wù)的平滑升級(jí)過(guò)程
缺點(diǎn):
需要開(kāi)發(fā)人員手動(dòng)增加服務(wù)注銷(xiāo)|注冊(cè)的接口
存在時(shí)間窗口,服務(wù)實(shí)例狀態(tài)變化感知不實(shí)時(shí)
方案二
基于nacos的console上下線功能
? 系統(tǒng)升級(jí)步驟:?
a斑响、在系統(tǒng)升級(jí)前先在nacos的console管理臺(tái)將對(duì)應(yīng)實(shí)例的服務(wù)下線
b菱属、服務(wù)下線之后钳榨,請(qǐng)求不會(huì)再分發(fā)到這個(gè)實(shí)例上來(lái)舰罚,對(duì)服務(wù)進(jìn)行打包部署
c、啟動(dòng)之后薛耻,服務(wù)上線完成服務(wù)的平滑升級(jí)過(guò)程
d营罢、重復(fù)a、b饼齿、c完成服務(wù)的平滑升級(jí)過(guò)程
缺點(diǎn):
服務(wù)實(shí)例依然存在饲漾,只是負(fù)載均衡器進(jìn)行了過(guò)濾,通過(guò)實(shí)例IP還是可以訪問(wèn)得到
存在時(shí)間窗口缕溉,服務(wù)實(shí)例狀態(tài)變化感知不實(shí)時(shí)
兩者有個(gè)共同的缺點(diǎn)-存在時(shí)間窗口問(wèn)題
這個(gè)是由于ribbon緩存機(jī)制造成的考传,它維護(hù)本地一份服務(wù)列表信息,需要本地輪詢证鸥,或心跳機(jī)制服務(wù)端推送來(lái)更新服務(wù)列表
解決方案僚楞,將spring.cloud.nacos.discovery.watch-delay=xx參數(shù)設(shè)置到一個(gè)合適的大小,可以縮短這個(gè)窗口期
方案三
我們知道nacos實(shí)現(xiàn)了服務(wù)權(quán)重的功能枉层,可以在控制臺(tái)自由編輯泉褐,且實(shí)時(shí)生效,基于此誕生第三種方案
?系統(tǒng)升級(jí)步驟
a鸟蜡、升級(jí)前先將目標(biāo)服務(wù)的權(quán)重調(diào)節(jié)至0膜赃,這時(shí)流量將會(huì)被截?cái)啵?qǐng)求不會(huì)分發(fā)到該實(shí)例上來(lái)
b揉忘、進(jìn)行打包部署
c跳座、部署后將該實(shí)例權(quán)重調(diào)節(jié)至合適值端铛,完成系統(tǒng)平滑升級(jí)過(guò)程
d、重復(fù)a疲眷、b沦补、c完成服務(wù)的平滑升級(jí)過(guò)程
優(yōu)點(diǎn):
沒(méi)有前面兩種方案的時(shí)間窗口問(wèn)題
三、方案選擇
綜上所述咪橙,采用方案三實(shí)現(xiàn)系統(tǒng)平滑上下線能力
四夕膀、效果測(cè)試
有兩個(gè)要求:
1)ServiceA下線一臺(tái)實(shí)例后,gatewat網(wǎng)關(guān)的調(diào)用不能失敗?
2)ServiceB下線一臺(tái)實(shí)例后美侦,ServiceA的Feign調(diào)用不能失敗?
啟動(dòng)三個(gè)服務(wù)分別是
gateway? ? ? 8001
demo-service1? ? 8785? ? ? ? 權(quán)重 1
demo-service2? ? ? 8786? ? ? 權(quán)重 1
測(cè)試連接http://網(wǎng)關(guān)IP:8001/unicorn-demo-service/demo/info
模擬服務(wù)升級(jí)的過(guò)程
1产舞、首先將demo-service1的權(quán)重設(shè)置為0
此時(shí)再訪問(wèn)測(cè)試連接,發(fā)現(xiàn)不在接受請(qǐng)求菠剩,所有的請(qǐng)求處理都分發(fā)給了demo-service2
2易猫、對(duì)服務(wù)進(jìn)行升級(jí),重新部署具壮,并啟動(dòng)完成
3准颓、將demo-service1的權(quán)重設(shè)置為1,此時(shí)再訪問(wèn)測(cè)試連接,發(fā)現(xiàn)該實(shí)例接受到請(qǐng)求棺妓,并且是升級(jí)之后的邏輯
4攘已、重復(fù)1、2怜跑、3样勃,對(duì)demo-service2做同樣的處理,再次訪問(wèn)測(cè)試連接性芬,發(fā)現(xiàn)兩臺(tái)實(shí)例均接受請(qǐng)求峡眶,并且達(dá)到升級(jí)后的效果
5、完成平滑升級(jí)