前端需要了解的泳道概念

背景
微服務(wù)框架下服務(wù)個數(shù)多、調(diào)用鏈路較長,其中一個服務(wù)出問題會影響到整條鏈路。但QA提測往往需要該條鏈路上的多個服務(wù)配套測試,甚至是同時測試一個服務(wù)的多個演進版本。
提供穩(wěn)定環(huán)境 和 多服務(wù)/多版本同時測試 看似相悖的需求,通過泳道“Swimlane”能夠得到解決。
測試過程中會遇到的問題
關(guān)于一個服務(wù)上的多個需求的同時測試,存在服務(wù)搶占分支測試的問題;
不同的業(yè)務(wù)組在測試時依賴的第三方服務(wù)有改動或正在進行新需求測試影響本業(yè)務(wù)測試。
微服務(wù)框架下服務(wù)個數(shù)多、調(diào)用鏈路較長,其中一個服務(wù)出問題會影響到整條鏈路。但QA提測往往需要該條鏈路上的多個服務(wù)配套測試,甚至是同時測試一個服務(wù)的多個演進版本。提供穩(wěn)定環(huán)境 和 多服務(wù)/多版本同時測試 看似相悖的需求,通過泳道“Swimlane”能夠得到解決。
什么是泳道
對服務(wù)鏈按需求進行分組復制,并實現(xiàn)邏輯、物理的隔離,使得不同需求的服務(wù)鏈運行在相隔的物理機器上,邏輯上如同游泳場中的泳道。

一個環(huán)境內(nèi)會有一條骨干鏈路(該環(huán)境的默認鏈路)和多條泳道。如圖所示,泳道隔離出了一條調(diào)用邊界:處于[泳道-1]內(nèi)的服務(wù)B要調(diào)用服務(wù)C,若在[泳道-1]內(nèi)部署了C服務(wù),則B只能調(diào)用泳道內(nèi)的C服務(wù),而不能調(diào)用骨干鏈路或其他泳道的C服務(wù);若在[泳道-1]內(nèi)沒有部署C服務(wù),則流量會調(diào)回骨干鏈路。
優(yōu)勢:
并行測試。(因此可以根據(jù)測試需要,部署不同分支的服務(wù)分組,多個泳道并行,多個服務(wù)/多個版本可同時提測)
提供穩(wěn)定的骨干鏈路。(保證整個測試流程始終能正常運行)
錯誤隔離。(泳道內(nèi)的服務(wù)發(fā)生異常 不會影響其他泳道)
泳道的特性
泳道相當于提供了多條“請求的跑道”,理解泳道主要在于理解“流量跑到哪去了”:
泳道內(nèi)如果沒有部署被調(diào)用服務(wù),流量會fallback到骨干
– 比如上圖[泳道-2]中的B服務(wù)節(jié)點 調(diào)用了 [骨干鏈路]中的C服務(wù)節(jié)點
泳道內(nèi)若存在被調(diào)用節(jié)點,那么流量是一定不會fallback的 (包括不可用的和禁用的)
– 比如上圖[泳道-2]中的A服務(wù)節(jié)點 只會調(diào)用 [泳道-2]中的B服務(wù)節(jié)點,即使[泳道-2]中的B不可用,也是不會fallback的
骨干環(huán)境是一定不會調(diào)用到泳道內(nèi)的
– 比如上圖中絕逼不會有 從[骨干鏈路]到[泳道-2]的調(diào)用
泳道之間是一定不會互相調(diào)用的
– 比如上圖中絕逼不會有 [泳道-1]與[泳道-2]之間的調(diào)用
泳道的實現(xiàn)
泳道實現(xiàn)的重點在于服務(wù)的注冊、發(fā)現(xiàn)和服務(wù)導流。
后端服務(wù)的注冊和發(fā)現(xiàn)的流程如下:
服務(wù)B啟動,上報ip、port、appkey、swimlane等信息
骨干鏈路上的服務(wù)A節(jié)點要調(diào)用B,先去取B的服務(wù)列表,并進行過濾:A不帶有泳道標識,所以只會調(diào)用不帶泳道標識的B服務(wù)節(jié)點
泳道1上的服務(wù)A節(jié)點要調(diào)用B,也會先去取B的服務(wù)列表,并進行過濾:A帶有泳道=泳道1 標識,所以只會調(diào)用同樣帶有泳道=泳道1 標識的B服務(wù)節(jié)點
服務(wù)導流
通過域名劃分泳道:為各個泳道申請單獨的域名,根據(jù)域名進行分流
通過header攜帶泳道信息:請求的header字段增加“swimlane=xxxx”,標識請求要打到名為xxxx的泳道里,分流系統(tǒng)會根據(jù)該字段做分流。
前端靜態(tài)資源,基于泳道名進行隔離,在資源編譯和打包的時候,指定發(fā)布的泳道名,然后資源會上傳到該泳道對應(yīng)的靜態(tài)服務(wù)器中:
1 | const swimName = process.env.SWIM_ENV; |
點個『在看』支持下?
