基于Java服務(wù)網(wǎng)關(guān)實(shí)現(xiàn)全鏈路灰度
通過(guò)SAE提供的全鏈路灰度功能,您可以輕松實(shí)現(xiàn)全面的流量控制,而無(wú)需更改您的業(yè)務(wù)代碼。本文主要介紹如何配置SAE全鏈路灰度,以Java服務(wù)網(wǎng)關(guān)為例,介紹如何實(shí)現(xiàn)端到端的灰度部署。
前提條件
已開(kāi)通MSE微服務(wù)治理專(zhuān)業(yè)版或企業(yè)版。具體操作,請(qǐng)參見(jiàn)開(kāi)通MSE微服務(wù)治理。
使用限制
全鏈路灰度僅適用于2023年11月08日起新建的微服務(wù)應(yīng)用。
全鏈路灰度功能僅支持在新版控制臺(tái)中使用。
由于全鏈路灰度功能整合了標(biāo)簽路由功能(此處指的是MSE微服務(wù)治理的標(biāo)簽路由,與MSE云原生網(wǎng)關(guān)的標(biāo)簽路由無(wú)關(guān)),因此不推薦已經(jīng)加入全鏈路灰度的應(yīng)用配置金絲雀發(fā)布和標(biāo)簽路由規(guī)則。
限制項(xiàng)
限制值
備注
Spring Cloud版本
Spring Cloud Edgware及以上版本
無(wú)。
Dubbo版本
2.5.3~2.7.8
Dubbo 3.0及以上版本當(dāng)前處于灰度中,如有場(chǎng)景需求,請(qǐng)提工單聯(lián)系MSE技術(shù)支持。
客戶端類(lèi)型
Resttemplate
Spring Cloud OpenFeign
無(wú)。
Java應(yīng)用JDK版本
目前支持JDK 6、7、8版本應(yīng)用接入
JDK 11版本當(dāng)前處于灰度中,如有場(chǎng)景需求,請(qǐng)提工單聯(lián)系MSE技術(shù)支持。
負(fù)載均衡類(lèi)型
Ribbon 2.0.x及以上版本
LoadBalancer 3.0.x及以上版本
無(wú)。
Spring Cloud Gateway版本
Spring Cloud Gateway 2.1.0.RELEASE及以上版本
無(wú)。
名詞解釋
泳道:為相同版本應(yīng)用定義的一套隔離環(huán)境。只有滿足了流控路由規(guī)則的請(qǐng)求流量才會(huì)路由到對(duì)應(yīng)泳道里的打標(biāo)應(yīng)用。一個(gè)應(yīng)用可以屬于多個(gè)泳道,一個(gè)泳道可以包含多個(gè)應(yīng)用,應(yīng)用和泳道是多對(duì)多的關(guān)系。
泳道組:泳道的集合。泳道組的作用主要是為了區(qū)分不同團(tuán)隊(duì)或不同場(chǎng)景。
基線環(huán)境:未打標(biāo)的應(yīng)用屬于基線環(huán)境,是其他環(huán)境的兜底環(huán)境。
場(chǎng)景示例
本文通過(guò)模擬真實(shí)的調(diào)用鏈路為您演示全鏈路灰度功能。您無(wú)需修改任何業(yè)務(wù)代碼,只需要給入口應(yīng)用設(shè)置流量規(guī)則,該流量的標(biāo)簽會(huì)通過(guò)鏈路透?jìng)鞯较乱粋€(gè)應(yīng)用中。在每個(gè)應(yīng)用的調(diào)用過(guò)程中,符合規(guī)則的流量會(huì)優(yōu)先調(diào)用到對(duì)應(yīng)的灰度應(yīng)用,如果沒(méi)有對(duì)應(yīng)的灰度應(yīng)用則會(huì)自動(dòng)切換回基線應(yīng)用。
各測(cè)試應(yīng)用部署如下表所示:
應(yīng)用 | 基線應(yīng)用 | 灰度應(yīng)用 | 灰度應(yīng)用上的標(biāo)簽 |
A | sc-a | sc-a-a1 | alicloud.service.tag:g1 |
sc-a-a2 | alicloud.service.tag:g2 | ||
B | sc-b | sc-b-b1 | alicloud.service.tag:g2 |
C | sc-c | sc-c-c1 | alicloud.service.tag:g1 |
sc-c-c2 | alicloud.service.tag:g2 | ||
Jave服務(wù)網(wǎng)關(guān) | sc-gw | 無(wú) | 無(wú) |
流量分發(fā)示意圖如下所示:
正常流量調(diào)用鏈路:
Java服務(wù)網(wǎng)關(guān) -> 應(yīng)用sc-a -> 應(yīng)用sc-b -> 應(yīng)用sc-c。
標(biāo)簽流量調(diào)用鏈路:
t=g1流量:Java服務(wù)網(wǎng)關(guān) -> 應(yīng)用sc-a-a1 -> 應(yīng)用sc-b -> 應(yīng)用sc-c-c1。
t=g2流量:Java服務(wù)網(wǎng)關(guān) -> 應(yīng)用sc-a-a2 -> 應(yīng)用sc-b-b2 -> 應(yīng)用sc-c-c2。
步驟一:搭建微服務(wù)應(yīng)用的基線應(yīng)用
在SAE控制臺(tái)部署使用鏡像部署sc-a、sc-b、sc-c、sc-gw(Java服務(wù)網(wǎng)關(guān))這四個(gè)基線應(yīng)用。
登錄SAE控制臺(tái),在左側(cè)導(dǎo)航欄選擇 ,然后選擇目標(biāo)地域和目標(biāo)命名空間,最后單擊創(chuàng)建應(yīng)用。
在創(chuàng)建應(yīng)用頁(yè)面,根據(jù)下表的說(shuō)明完成應(yīng)用部署。
配置區(qū)域
配置項(xiàng)
說(shuō)明
基礎(chǔ)信息設(shè)置區(qū)域
應(yīng)用名稱(chēng)
自定義應(yīng)用名稱(chēng)。名稱(chēng)為1~36個(gè)字符,可包含數(shù)字、字母以及中劃線(-),必須以字母開(kāi)頭。
應(yīng)用描述
介紹應(yīng)用的基本情況。
命名空間類(lèi)型
可選擇的類(lèi)型有以下兩種:
系統(tǒng)創(chuàng)建:應(yīng)用會(huì)創(chuàng)建在目標(biāo)地域下的默認(rèn)命名空間內(nèi),例如cn-shanghai。
選擇已有命名空間:從下拉列表選擇已創(chuàng)建的自定義命名空間、交換機(jī) vSwitch和安全組。
應(yīng)用部署方式
選擇鏡像部署,然后單擊設(shè)置鏡像。
在彈出的設(shè)置鏡像面板中,請(qǐng)按照以下說(shuō)明進(jìn)行部署。
技術(shù)棧語(yǔ)言:選擇目標(biāo)語(yǔ)言。
語(yǔ)言環(huán)境:在下拉框中選擇對(duì)應(yīng)語(yǔ)言的應(yīng)用運(yùn)行環(huán)境。
鏡像服務(wù)版本:選擇鏡像服務(wù)個(gè)人版或鏡像服務(wù)企業(yè)版。
單擊鏡像倉(cāng)庫(kù)命名空間,選擇鏡像倉(cāng)庫(kù)命名空間。
單擊目標(biāo)鏡像倉(cāng)庫(kù)名稱(chēng)選擇鏡像版本列的下拉框,選擇鏡像版本。
單擊確定。
容量設(shè)置
單實(shí)例規(guī)格
設(shè)置單實(shí)例的CPU和內(nèi)存,取值范圍為[1,50]。默認(rèn)值為2。
實(shí)例數(shù)
設(shè)置實(shí)例個(gè)數(shù),取值范圍為[1,50]。默認(rèn)值為2。
單擊下一步:高級(jí)設(shè)置,進(jìn)行高級(jí)配置。具體步驟,請(qǐng)參見(jiàn)高級(jí)配置。
單擊創(chuàng)建應(yīng)用。
步驟二:開(kāi)啟基線環(huán)境的微服務(wù)治理功能
全鏈路灰度為MSE微服務(wù)治理專(zhuān)業(yè)版功能,鏈路中所有涉及的應(yīng)用均需開(kāi)啟微服務(wù)治理功能才能使用。
登錄SAE控制臺(tái),在左側(cè)導(dǎo)航欄選擇 ,然后選擇目標(biāo)地域和目標(biāo)命名空間,最后單擊目標(biāo)應(yīng)用名稱(chēng)。
在左側(cè)導(dǎo)航欄,選擇
,單擊開(kāi)啟微服務(wù)治理。說(shuō)明應(yīng)用開(kāi)通的微服務(wù)治理功能的版本與MSE版本保持一致。
開(kāi)啟微服務(wù)治理需要1~2分鐘,請(qǐng)您耐心等待。
步驟三:基于基線環(huán)境創(chuàng)建灰度應(yīng)用
基于基線應(yīng)用部署灰度應(yīng)用,其中sc-a和sc-c應(yīng)用分別部署兩個(gè)灰度應(yīng)用(sc-a-a1,sc-a-a2,sc-c-c1,sc-c-c2),sc-b應(yīng)用部署一個(gè)灰度應(yīng)用(sc-b-b2)。
登錄Serverless 應(yīng)用引擎控制臺(tái)。
在左側(cè)導(dǎo)航欄,單擊應(yīng)用列表,然后在頂部菜單欄選擇目標(biāo)地域。
在應(yīng)用列表頁(yè)面,單擊目標(biāo)應(yīng)用操作列的圖標(biāo),然后單擊創(chuàng)建灰度應(yīng)用。
在創(chuàng)建灰度應(yīng)用頁(yè)面,按照下表的說(shuō)明完成應(yīng)用的創(chuàng)建。
設(shè)置區(qū)域
設(shè)置項(xiàng)
說(shuō)明
基礎(chǔ)信息設(shè)置
應(yīng)用名稱(chēng)
自定義應(yīng)用名稱(chēng)。名稱(chēng)為1~36個(gè)字符,可包含數(shù)字、字母以及中劃線(-),必須以字母開(kāi)頭。
應(yīng)用描述
自定義應(yīng)用的基本情況。
命名空間類(lèi)型
按照控制臺(tái)的默認(rèn)配置選擇選擇已有命名空間以繼承基線應(yīng)用的設(shè)置。
命名空間:繼承基線應(yīng)用的配置,不支持修改。
專(zhuān)有網(wǎng)絡(luò) VPC:繼承基線應(yīng)用的配置,不支持修改。
交換機(jī)vSwitch:選擇交換機(jī)。
安全組:選擇安全組。
應(yīng)用部署方式
默認(rèn)繼承基線應(yīng)用的設(shè)置,您可以根據(jù)需求選擇覆蓋或添加新的配置。
灰度標(biāo)簽
名稱(chēng)
全鏈路灰度路由功能需搭配灰度標(biāo)簽才能使用,且標(biāo)簽名稱(chēng)必須設(shè)置為
alicloud.service.tag
,否則將無(wú)法通過(guò)標(biāo)簽值識(shí)別到該灰度應(yīng)用。值
自定義標(biāo)簽值。標(biāo)簽值為1-20個(gè)字符,只能由字母和數(shù)字組成,且字母區(qū)分大小寫(xiě),如
gray
和GRAY
是兩個(gè)不同的標(biāo)簽值。容量設(shè)置
單實(shí)例規(guī)格
設(shè)置CPU和內(nèi)存,取值范圍為[1,50]。默認(rèn)值為2。
實(shí)例數(shù)
設(shè)置實(shí)例個(gè)數(shù),取值范圍為[1,50]。默認(rèn)值為2。
單擊下一步:高級(jí)設(shè)置,進(jìn)行高級(jí)配置。具體步驟,請(qǐng)參見(jiàn)高級(jí)配置。
單擊創(chuàng)建應(yīng)用。
步驟四:創(chuàng)建泳道組
登錄Serverless 應(yīng)用引擎控制臺(tái)。
在左側(cè)導(dǎo)航欄單擊微服務(wù)治理,然后單擊全鏈路灰度。
在全鏈路灰度頁(yè)面,在頁(yè)面頂部單擊目標(biāo)命名空間,然后單擊創(chuàng)建泳道組及泳道。
在彈出的創(chuàng)建泳道組面板,根據(jù)下表說(shuō)明設(shè)置泳道組相關(guān)參數(shù),然后單擊確定。
配置項(xiàng)
說(shuō)明
泳道組名稱(chēng)
自定義泳道組名稱(chēng)。
入口類(lèi)型
選擇Java 服務(wù)網(wǎng)關(guān)。
泳道組流量入口
選擇您的流量入口。
泳道組涉及應(yīng)用
選擇您入口網(wǎng)關(guān)所涉及的所有相關(guān)應(yīng)用,可以選擇多個(gè)。
泳道組創(chuàng)建完成后,在全鏈路灰度頁(yè)面的泳道組區(qū)域,可以查看您創(chuàng)建的泳道組。如需變更泳道組信息,單擊目標(biāo)泳道組右上角的編輯,可在頁(yè)面自行修改相關(guān)信息。
步驟五:創(chuàng)建泳道
在全鏈路灰度頁(yè)面,在頁(yè)面下方單擊點(diǎn)擊創(chuàng)建第一個(gè)分流泳道,如果您選擇的微服務(wù)空間內(nèi)已經(jīng)創(chuàng)建過(guò)泳道,則單擊創(chuàng)建泳道。
在彈出的創(chuàng)建泳道頁(yè)面,按照下表說(shuō)明完成泳道的創(chuàng)建,然后單擊確定。
配置項(xiàng)
說(shuō)明
泳道名稱(chēng)
自定義泳道名稱(chēng)。
泳道標(biāo)簽
選擇需要加入同一條泳道的應(yīng)用對(duì)應(yīng)灰度版本的
alicloud.service.tag
標(biāo)簽。Path
選擇匹配路徑,若為空則代表匹配所有路徑。
灰度模式
按照控制臺(tái)提示選擇灰度模式:
按內(nèi)容灰度。
按比例灰度。
說(shuō)明灰度模式在整個(gè)泳道組內(nèi)需保持一致,一旦第一條泳道成功創(chuàng)建,后續(xù)泳道就不可以再對(duì)其進(jìn)行更改。
灰度條件
灰度條件指定了請(qǐng)求內(nèi)容的灰度匹配方式。當(dāng)請(qǐng)求內(nèi)容滿足下列條件時(shí),會(huì)被打上先前指定的泳道標(biāo)簽:
以下條件同時(shí)滿足。
以下條件任意滿足。
說(shuō)明可以選擇的條件類(lèi)型:
參數(shù)類(lèi)型。
參數(shù)。
條件。
值。
步驟六:基線應(yīng)用及灰度應(yīng)用流量驗(yàn)證
按內(nèi)容灰度流量驗(yàn)證
使用curl命令測(cè)試基線流量:
#測(cè)試命令 curl 8.130.XX.XX/A/a # 測(cè)試結(jié)果 A[192.168.XX.XX][config=base] -> B[192.168.XX.XX] -> C[192.168.XX.XX]
說(shuō)明命令中的
8.130.XX.XX
是服務(wù)網(wǎng)關(guān)暴露的IP地址。使用curl命令測(cè)試灰度流量:
# 測(cè)試命令 curl 8.130.XX.XX/A/a -H "tag: ${tag}" # 測(cè)試結(jié)果 A${tag}[192.168.XX.XX][config=base] -> B[192.168.XX.XX] -> C${tag}[192.168.XX.XX]
說(shuō)明例如:當(dāng)Header的參數(shù)中帶上
tag: ${tag}
時(shí),會(huì)命中灰度標(biāo)簽,并向后透?jìng)鳌?/p>
按比例灰度流量驗(yàn)證
使用curl命令測(cè)進(jìn)行驗(yàn)證:
#測(cè)試命令
curl 8.130.XX.XX/A/a
# 測(cè)試結(jié)果
A[192.168.XX.XX][config=base] -> B[192.168.XX.XX] -> C[192.168.XX.XX]
# 測(cè)試結(jié)果
Agray[192.168.XX.XX][config=base] -> B[192.168.XX.XX] -> Cgray[192.168.XX.XX]
命令中的 8.130.XX.XX
是服務(wù)網(wǎng)關(guān)暴露的IP地址。
步驟七:微服務(wù)治理可觀測(cè)
在SAE控制臺(tái)的全鏈路灰度頁(yè)面,在選擇泳道組下拉列表中選擇目標(biāo)泳道組,在泳道組及涉及的應(yīng)用區(qū)域單擊目標(biāo)應(yīng)用,在應(yīng)用QPS監(jiān)控區(qū)域,可查看對(duì)應(yīng)泳道基線版本和灰度版本的流量情況。選擇回放時(shí)間,展示所選時(shí)間對(duì)應(yīng)的指標(biāo)數(shù)據(jù)。
監(jiān)控回放僅支持回放一天內(nèi)的指標(biāo)數(shù)據(jù)。
總QPS:該應(yīng)用總的每秒請(qǐng)求數(shù)(QPS)。
異常QPS:該應(yīng)用出錯(cuò)的每秒請(qǐng)求數(shù)(QPS)。
未打標(biāo)QPS:該應(yīng)用未打標(biāo)的流量的每秒請(qǐng)求數(shù)(QPS)。