前言
Spring Cloud Tencent 微服務(wù)開(kāi)發(fā)框架自六月底正式對(duì)外宣發(fā)后,受到了許多開(kāi)發(fā)者非常火熱的關(guān)注。不到一個(gè)月時(shí)間, Github Star 數(shù)就已突破 2000,超過(guò) 1000 名開(kāi)發(fā)者加入我們的社群,并有 20 多個(gè)開(kāi)發(fā)者參與貢獻(xiàn)項(xiàng)目代碼,項(xiàng)目的熱門程度極大地超出我們的預(yù)期,同時(shí)也驗(yàn)證了我們?cè)谧畛跣l(fā)文章里的觀點(diǎn):Spring Boot + Spring Cloud 仍是當(dāng)前使用相當(dāng)廣泛開(kāi)發(fā)框架。
在這一個(gè)月時(shí)間里,Spring Cloud Tencent 的關(guān)注者們最關(guān)心的問(wèn)題就是,Spring Cloud Tencent 后續(xù)規(guī)劃是什么?
在過(guò)去的一段時(shí)間,我們的主要精力聚焦在微服務(wù)領(lǐng)域最基本的服務(wù)治理原子能力,例如服務(wù)發(fā)現(xiàn)、動(dòng)態(tài)配置、限流熔斷、路由等。Spring Cloud 其它套件基本上也局限于這些基礎(chǔ)能力。但是企業(yè)真正在實(shí)踐 Spring Cloud 過(guò)程中,發(fā)現(xiàn)針對(duì)自身具體的業(yè)務(wù)場(chǎng)景,這些原子能力并不能直接提供解決方案,往往需要做二次開(kāi)發(fā)、定制等。例如定制 Spring Cloud Gateway 的 Filter、增強(qiáng) Feign、支持各種復(fù)雜的服務(wù)路由場(chǎng)景等。因此,開(kāi)箱即用的業(yè)務(wù)通用解決方案對(duì)企業(yè)來(lái)說(shuō)更具有價(jià)值。
綜上所述, Spring Cloud Tencent 后續(xù)重要的規(guī)劃之一就是在不斷夯實(shí)服務(wù)治理原子能力的基礎(chǔ)上,提供開(kāi)箱即用的業(yè)務(wù)通用解決方案,從工具到方案的升級(jí)。
為此 Spring Cloud Tencent 新增了 spring-cloud-tencent-plugin-starts 模塊,在此模塊下實(shí)現(xiàn)不同業(yè)務(wù)場(chǎng)景的解決方案。現(xiàn)階段我們主要聚焦在精細(xì)化流量治理能力場(chǎng)景化方案上,并按照開(kāi)發(fā)流程拆分為三個(gè)階段:
開(kāi)發(fā)測(cè)試階段的多測(cè)試環(huán)境場(chǎng)景
發(fā)布階段的金絲雀發(fā)布、藍(lán)綠發(fā)布、全鏈路灰度等
生產(chǎn)運(yùn)行階段的單元化、AB測(cè)試等
本期我們主要聊聊開(kāi)發(fā)測(cè)試階段的多測(cè)試環(huán)境場(chǎng)景實(shí)戰(zhàn),詳細(xì)介紹 Spring Cloud Tencent 實(shí)現(xiàn)多測(cè)試環(huán)境場(chǎng)景的方案。
一、基礎(chǔ)知識(shí)
1.1 什么是測(cè)試環(huán)境路由
在實(shí)際的開(kāi)發(fā)過(guò)程中,一個(gè)微服務(wù)架構(gòu)系統(tǒng)下的不同微服務(wù)可能是由多個(gè)團(tuán)隊(duì)進(jìn)行開(kāi)發(fā)與維護(hù)的,每個(gè)團(tuán)隊(duì)只需關(guān)注所屬的一個(gè)或多個(gè)微服務(wù),而各個(gè)團(tuán)隊(duì)維護(hù)的微服務(wù)之間可能存在相互調(diào)用關(guān)系。如果一個(gè)團(tuán)隊(duì)在開(kāi)發(fā)其所屬的微服務(wù),調(diào)試的時(shí)候需要驗(yàn)證完整的微服務(wù)調(diào)用鏈路。此時(shí)需要依賴其他團(tuán)隊(duì)的微服務(wù),如何部署開(kāi)發(fā)聯(lián)調(diào)環(huán)境就會(huì)遇到以下問(wèn)題:
如果所有團(tuán)隊(duì)都使用同一套開(kāi)發(fā)聯(lián)調(diào)環(huán)境,那么一個(gè)團(tuán)隊(duì)的測(cè)試微服務(wù)實(shí)例無(wú)法正常運(yùn)行時(shí),會(huì)影響其他依賴該微服務(wù)的應(yīng)用也無(wú)法正常運(yùn)行。
如果每個(gè)團(tuán)隊(duì)有單獨(dú)的一套開(kāi)發(fā)聯(lián)調(diào)環(huán)境,那么每個(gè)團(tuán)隊(duì)不僅需要維護(hù)自己環(huán)境的微服務(wù)應(yīng)用,還需要維護(hù)其他團(tuán)隊(duì)環(huán)境的自身所屬微服務(wù)應(yīng)用,效率大大降低。同時(shí),每個(gè)團(tuán)隊(duì)都需要部署完整的一套微服務(wù)架構(gòu)應(yīng)用,成本也隨著團(tuán)隊(duì)數(shù)的增加而大大上升。
此時(shí)可以使用測(cè)試環(huán)境路由的架構(gòu)來(lái)幫助部署一套運(yùn)維簡(jiǎn)單且成本較低開(kāi)發(fā)聯(lián)調(diào)環(huán)境。測(cè)試環(huán)境路由是一種基于服務(wù)路由的環(huán)境治理策略,核心是維護(hù)一個(gè)穩(wěn)定的基線環(huán)境作為基礎(chǔ)環(huán)境,測(cè)試環(huán)境僅需要部署需要變更的微服務(wù)。多測(cè)試環(huán)境有兩個(gè)基礎(chǔ)概念,如下所示:
基線環(huán)境(Baseline Environment): 完整穩(wěn)定的基礎(chǔ)環(huán)境,是作為同類型下其他環(huán)境流量通路的一個(gè)兜底可用環(huán)境,用戶應(yīng)該盡量保證基線環(huán)境的完整性、穩(wěn)定性。
測(cè)試環(huán)境(Feature Environment): 一種臨時(shí)環(huán)境,僅可能為開(kāi)發(fā)/測(cè)試環(huán)境類型,測(cè)試環(huán)境不需要部署全鏈路完整的服務(wù),而是僅部署本次有變更的服務(wù),其他服務(wù)通過(guò)服務(wù)路由的方式復(fù)用基線環(huán)境服務(wù)資源。
部署完成多測(cè)試環(huán)境后,開(kāi)發(fā)者可以通過(guò)一定的路由規(guī)則方式,將測(cè)試請(qǐng)求打到不同的測(cè)試環(huán)境,如果測(cè)試環(huán)境沒(méi)有相應(yīng)的微服務(wù)處理鏈路上的請(qǐng)求,那么會(huì)降級(jí)到基線環(huán)境處理。因此,開(kāi)發(fā)者需要將開(kāi)發(fā)新測(cè)試的微服務(wù)部署到對(duì)應(yīng)的測(cè)試環(huán)境,而不需要更新或不屬于開(kāi)發(fā)者管理的微服務(wù)則復(fù)用基線環(huán)境的服務(wù),完成對(duì)應(yīng)測(cè)試環(huán)境的測(cè)試。
雖然測(cè)試環(huán)境路由是一個(gè)相對(duì)成熟的開(kāi)發(fā)測(cè)試環(huán)境解決方案,但是能夠開(kāi)箱即用的生產(chǎn)開(kāi)發(fā)框架卻不多,往往需要開(kāi)發(fā)者二次開(kāi)發(fā)相應(yīng)的功能。因此需要一個(gè)相對(duì)完善的解決方案來(lái)幫助實(shí)現(xiàn)測(cè)試環(huán)境路由,簡(jiǎn)化開(kāi)發(fā)難度并提升開(kāi)發(fā)效率。
1.2 服務(wù)路由
服務(wù)路由模型
服務(wù)路由抽象出最簡(jiǎn)化的模型如下圖所示,解決的是 “哪些請(qǐng)求轉(zhuǎn)發(fā)到哪些實(shí)例” 的問(wèn)題。細(xì)化來(lái)看,包含三個(gè)問(wèn)題:1. 如何精確標(biāo)識(shí)請(qǐng)求?2. 如何精確標(biāo)識(shí)實(shí)例?3. 如何轉(zhuǎn)發(fā)?
(圖:服務(wù)路由模型示意圖)
在流量的微觀世界里,統(tǒng)一通過(guò)標(biāo)簽(屬性)來(lái)標(biāo)識(shí)一個(gè)實(shí)體,例如請(qǐng)求有來(lái)源調(diào)用服務(wù)、目標(biāo)環(huán)境標(biāo)簽等,服務(wù)實(shí)例則有版本號(hào)、實(shí)例分組、環(huán)境分組等標(biāo)簽。服務(wù)路由則是將滿足標(biāo)簽匹配條件的請(qǐng)求轉(zhuǎn)發(fā)到滿足匹配條件的服務(wù)實(shí)例。所以服務(wù)路由的模型可拆解出如下的的專業(yè)術(shù)語(yǔ):
服務(wù)實(shí)例染色 (為服務(wù)實(shí)例設(shè)置標(biāo)簽信息)
流量染色(為請(qǐng)求設(shè)置標(biāo)簽信息)
服務(wù)路由(根據(jù)路由策略,把請(qǐng)求轉(zhuǎn)發(fā)到目標(biāo)實(shí)例)
服務(wù)實(shí)例標(biāo)簽如何傳遞到調(diào)用方
服務(wù)實(shí)例注冊(cè)到注冊(cè)中心時(shí),會(huì)帶上標(biāo)簽信息。服務(wù)調(diào)用方從注冊(cè)中心獲取到服務(wù)實(shí)例信息就包含了實(shí)例的標(biāo)簽信息。
標(biāo)簽全鏈路透?jìng)?/strong>
有一類請(qǐng)求標(biāo)簽數(shù)據(jù)需要在業(yè)務(wù)響應(yīng)鏈路上一直傳遞,例如全鏈路追蹤里的 TraceId 、測(cè)試環(huán)境路由的 FeatureEnv 標(biāo)簽等。
服務(wù)路由和負(fù)載均衡的區(qū)別
服務(wù)路由和負(fù)載均衡都是解決選擇服務(wù)實(shí)例的問(wèn)題。區(qū)別在于服務(wù)路由是從全量的服務(wù)實(shí)例中挑選出一批滿足路由規(guī)則的服務(wù)實(shí)例,而負(fù)載均衡則是從路由匹配之后的服務(wù)實(shí)例列表中挑選出一個(gè)適合處理請(qǐng)求的實(shí)例。
二、測(cè)試環(huán)境路由實(shí)現(xiàn)原理
2.1 方案總覽
測(cè)試環(huán)境路由的樣例實(shí)現(xiàn)以下圖為例,一共有兩個(gè)測(cè)試環(huán)境以及一個(gè)基線環(huán)境。流量從端到端會(huì)依次經(jīng)過(guò)以下組件:App -> 網(wǎng)關(guān) -> 用戶中心 -> 積分中心 -> 活動(dòng)中心。
圖:測(cè)試環(huán)境路由示意圖
根據(jù)上一節(jié)服務(wù)路由章節(jié)所述,為了達(dá)到測(cè)試環(huán)境路由的能力,開(kāi)發(fā)工作需要做三件事情:
服務(wù)實(shí)例染色(標(biāo)識(shí)實(shí)例屬于哪個(gè)測(cè)試環(huán)境)
流量染色(標(biāo)識(shí)請(qǐng)求應(yīng)該被轉(zhuǎn)發(fā)到哪個(gè)測(cè)試環(huán)境)
服務(wù)路由 a. 網(wǎng)關(guān)根據(jù)請(qǐng)求的目標(biāo)測(cè)試環(huán)境標(biāo)簽轉(zhuǎn)發(fā)到對(duì)應(yīng)的目標(biāo)測(cè)試環(huán)境的用戶中心。 b. 服務(wù)調(diào)用時(shí),優(yōu)先轉(zhuǎn)發(fā)到同測(cè)試環(huán)境下的目標(biāo)服務(wù)實(shí)例,如果同測(cè)試環(huán)境下沒(méi)有服務(wù)實(shí)例則轉(zhuǎn)發(fā)到基線環(huán)境。
以下三小節(jié),將會(huì)詳細(xì)介紹這三部分的原理。
2.2 服務(wù)實(shí)例染色
在多測(cè)試環(huán)境的場(chǎng)景中,需要對(duì)每個(gè)測(cè)試環(huán)境部署的實(shí)例進(jìn)行區(qū)分,因此需要在實(shí)例上打
方式一:配置文件
在 Spring Boot 的 application.yml 配置文件里配置以下內(nèi)容即可實(shí)現(xiàn)染色:
spring: cloud: tencent: metadata: content: idc:shanghai env:f1
Spring Cloud Tencent 應(yīng)用在啟動(dòng)時(shí),讀取配置文件并解析出 idc=shanghai 和 env=f1 標(biāo)簽信息。
如果以上配置文件放在項(xiàng)目源碼里,要實(shí)現(xiàn)不同的實(shí)例具有不同的標(biāo)簽值則需要打不同包??梢酝ㄟ^(guò)以下兩種方式實(shí)現(xiàn)同一個(gè)運(yùn)行包設(shè)置不同的標(biāo)簽值:
通過(guò) -D 啟動(dòng)參數(shù)覆蓋,例如:-Dspring.cloud.tencent.metadata.content.idc=guangzhou
通過(guò) Spring Boot 標(biāo)準(zhǔn)方式,把a(bǔ)pplication.yml外掛本地磁盤上
方式二:環(huán)境變量
環(huán)境變量在容器場(chǎng)景下非常方便,Spring Cloud Tencent 約定了前綴為 SCT_METADATA_CONTENT_ 的環(huán)境變量為實(shí)例的標(biāo)簽信息,例如:
SCT_METADATA_CONTENT_IDC=shanghai
SCT_METADATA_CONTENT_ENV=f1
Spring Cloud Tencent 應(yīng)用在啟動(dòng)時(shí),自動(dòng)會(huì)讀取環(huán)境變量并解析出 IDC=shanghai 和 ENV=f1 標(biāo)簽信息。
方式三:自定義實(shí)現(xiàn) SPI
前面兩種方式為 Spring Cloud Tencent 內(nèi)置的方式,但是不一定符合每個(gè)生產(chǎn)項(xiàng)目的規(guī)范,因此 Spring Cloud Tencent 還提供了一種允許開(kāi)發(fā)者自定義標(biāo)簽 Provider 的方式。例如以下兩種實(shí)踐場(chǎng)景:
把實(shí)例標(biāo)簽放到機(jī)器上的某一個(gè)配置文件里,例如 /etc/metadata。
應(yīng)用啟動(dòng)時(shí),調(diào)用公司的 CMDB 接口獲取元信息。
這種場(chǎng)景下,只要實(shí)現(xiàn) InstanceMetadataProvider SPI 擴(kuò)展即可。
2.3 流量染色
流量染色即為每個(gè)請(qǐng)求打上目標(biāo)測(cè)試環(huán)境標(biāo)簽,路由轉(zhuǎn)發(fā)時(shí)根據(jù)請(qǐng)求標(biāo)簽匹配目標(biāo)服務(wù)實(shí)例。而流量染色可以分為以下幾種方式:
方式一:靜態(tài)染色
2.2 小節(jié)介紹了可以為服務(wù)實(shí)例設(shè)置一系列的標(biāo)簽信息,例如 idc=shanghai、env=f1 等。在有些場(chǎng)景下,期望所有經(jīng)過(guò)當(dāng)前實(shí)例的請(qǐng)求都帶上當(dāng)前實(shí)例的標(biāo)簽信息。例如經(jīng)過(guò) env=f1 的實(shí)例的請(qǐng)求都攜帶 env=f1 的標(biāo)簽信息。
服務(wù)實(shí)例染色有三種方式,對(duì)應(yīng)的定義哪些標(biāo)簽需要作為請(qǐng)求標(biāo)簽透?jìng)鞯芥溌飞弦灿腥N方式,核心思想就是定義需要全鏈路傳遞的標(biāo)簽鍵值對(duì)的鍵列表。
通過(guò)配置文件的 spring.cloud.tencent.metadata.content.transitive=["idc", "env"] 配置項(xiàng)指定
通過(guò) SCT_METADATA_CONTENT_TRANSITIVE=IDC,ENV 環(huán)境變量指定
通過(guò)實(shí)現(xiàn) InstanceMetadataProvider#getTransitiveMetadataKeys() 方法指定
方式二:動(dòng)態(tài)染色
靜態(tài)染色是把服務(wù)實(shí)例的某些標(biāo)簽作為請(qǐng)求標(biāo)簽,服務(wù)實(shí)例標(biāo)簽相對(duì)靜態(tài),應(yīng)用啟動(dòng)后初始化一次之后就不再變更。但是在實(shí)際的應(yīng)用場(chǎng)景下,不同的請(qǐng)求往往需要設(shè)置不同的標(biāo)簽信息。此時(shí)則需要通過(guò)動(dòng)態(tài)染色的能力。
為請(qǐng)求動(dòng)態(tài)染色也非常簡(jiǎn)單,只需增加以 X-Polaris-Metadata-Transitive- 為前綴的 HTTP 請(qǐng)求頭即可,例如:X-Polaris-Metadata-Transitive-featureenv=f1。這樣 featureenv=f1 就能夠作為請(qǐng)求標(biāo)簽在鏈路上透?jìng)鳌?/p>
方式三:網(wǎng)關(guān)流量染色
網(wǎng)關(guān)常常作為流量的入口或者中轉(zhuǎn)站。經(jīng)過(guò)網(wǎng)關(guān)的請(qǐng)求,可以根據(jù)某些染色規(guī)則為請(qǐng)求增加標(biāo)簽信息。例如滿足請(qǐng)求參數(shù) uid=1000 請(qǐng)求打上 featureenv=f1 標(biāo)簽。
網(wǎng)關(guān)流量染色是非常實(shí)用的能力,在 Spring Cloud Tencent 里實(shí)現(xiàn)了非常靈活基于染色規(guī)則的 Spring Cloud Gateway 染色插件。例如以下染色規(guī)則可以實(shí)現(xiàn)為 uid=1000 的請(qǐng)求打上 featureenv=f1 標(biāo)簽、uid=1001 的請(qǐng)求打上 featureenv=f2 標(biāo)簽。更詳細(xì)的染色規(guī)則,可以參考文檔。
{ "rules":[ { "conditions":[ { "key":"${http.query.uid}", "values":["1000"], "operation":"EQUALS" } ], "labels":[ { "key":"featureenv", "value":"f1" } ] }, { "conditions":[ { "key":"${http.query.uid}", "values":["1001"], "operation":"EQUALS" } ], "labels":[ { "key":"featureenv", "value":"f2" } ] } ] }
同時(shí) Spring Cloud Tencent 也預(yù)留了 TrafficStainer SPI ,用戶可以實(shí)現(xiàn)自定義流量染色插件。
2.4 Spring Cloud Tencent 路由功能原理
北極星提供了非常完善的服務(wù)治理能力,上層的服務(wù)框架基于北極星原生 SDK 就能快速實(shí)現(xiàn)強(qiáng)大的服務(wù)治理能力。Spring Cloud Tencent 就是在北極星的基礎(chǔ)上實(shí)現(xiàn)了服務(wù)路由能力。
北極星服務(wù)路由原理
北極星服務(wù)路由實(shí)現(xiàn)原理并不復(fù)雜,如下圖所示,從注冊(cè)中心獲取到所有實(shí)例信息,再經(jīng)過(guò)一系列的 RouterFilter 插件過(guò)濾出滿足條件的實(shí)例集合。
圖:北極星服務(wù)路由執(zhí)行鏈
在多測(cè)試環(huán)境場(chǎng)景下主要用到了 MetadataRouter (元數(shù)據(jù)路由)插件,此插件核心能力是根據(jù)請(qǐng)求的標(biāo)簽完全匹配服務(wù)實(shí)例的標(biāo)簽。
例如請(qǐng)求有兩個(gè)標(biāo)簽 key1=value1和 key2=value2,MetadataRouter 則會(huì)篩選出所有實(shí)例中包含同時(shí)滿足 key1=value1 和 key2=value2 的服務(wù)實(shí)例。在多測(cè)試環(huán)境場(chǎng)景下,Spring Cloud Tencent 缺省使用 featureenv 標(biāo)簽,通過(guò) featureenv 標(biāo)簽篩選出屬于同一個(gè)測(cè)試環(huán)境的服務(wù)實(shí)例。
Spring Cloud Tencent 服務(wù)路由原理
Spring Cloud Tencent 實(shí)現(xiàn)路由核心分成兩個(gè)部分:
擴(kuò)展 RestTemplate 、 Feign、SCG 獲取請(qǐng)求的標(biāo)簽信息并塞到 RouterContext (路由信息上下文)里。
擴(kuò)展 Spring Cloud 負(fù)載均衡組件(Hoxton 版本之前為 Ribbon,2020版本之后為 Spring Cloud LoadBalancer),在擴(kuò)展的實(shí)現(xiàn)里調(diào)用北極星的服務(wù)路由 API 實(shí)現(xiàn)服務(wù)實(shí)例過(guò)濾。
擴(kuò)展部分邏輯較為復(fù)雜,感興趣的讀者可以參考 spring-cloud-starter-tencent-polaris-router 模塊源碼。
三、測(cè)試環(huán)境路由用戶操作指引
在上一節(jié)中詳細(xì)介紹了測(cè)試環(huán)境路由的實(shí)現(xiàn)原理,這一節(jié)則詳細(xì)介紹站在用戶的視角需要操作的內(nèi)容。
通過(guò) Spring Cloud Tencent 實(shí)現(xiàn)流量的測(cè)試環(huán)境路由非常簡(jiǎn)單,核心包含三步:
服務(wù)增加測(cè)試環(huán)境路由插件依賴
部署的實(shí)例打上環(huán)境標(biāo)簽
為請(qǐng)求流量打上環(huán)境標(biāo)簽
完成以上三個(gè)步驟即可。
3.1 添加測(cè)試環(huán)境路由插件依賴
Spring Cloud Tencent 中的 spring-cloud-tencent-featureenv-plugin 模塊閉環(huán)了測(cè)試環(huán)境路由全部能力,所有服務(wù)只需要添加該依賴即可引入測(cè)試環(huán)境路由能力。
3.2 服務(wù)實(shí)例打上環(huán)境標(biāo)簽
spring-cloud-tencent-featureenv-plugin 默認(rèn)以 featureenv 標(biāo)簽作為匹配標(biāo)簽,用戶也可以通過(guò)系統(tǒng)內(nèi)置的 system-feature-env-router-label=custom_feature_env_key 標(biāo)簽來(lái)指定測(cè)試環(huán)境路由使用的標(biāo)簽鍵。以下三種方式以默認(rèn)的 featureenv 作為示例。
方式一:配置文件
在服務(wù)實(shí)例的配置文件中添加配置,如在 bootstrap.yml添加如下所示即可:
spring: cloud: tencent: metadata: content: featureenv:f1#f1替換為測(cè)試環(huán)境名稱
方式二:環(huán)境變量
在服務(wù)實(shí)例所在的操作系統(tǒng)中添加環(huán)境變量也可進(jìn)行打標(biāo),例如:SCT_METADATA_CONTENT_featureenv=f1
方式三:SPI 方式
自定義實(shí)現(xiàn) InstanceMetadataProvider#getMetadata() 方法的返回值里里包含 featureenv 即可。
基線環(huán)境標(biāo)簽值
注意,基線環(huán)境部署的服務(wù)實(shí)例不需要設(shè)置 featureenv 標(biāo)簽,表明其不屬于任何測(cè)試環(huán)境,才可在請(qǐng)求沒(méi)有匹配到對(duì)應(yīng)測(cè)試環(huán)境的時(shí)候,匹配到基線環(huán)境。
3.3 流量染色
方式一:客戶端染色 (推薦)
如下圖所示,在客戶端發(fā)出的 HTTP 請(qǐng)求里,新增 X-Polaris-Metadata-Transitive-featureenv=f1 請(qǐng)求頭即可實(shí)現(xiàn)染色。該方式是讓開(kāi)發(fā)者在請(qǐng)求創(chuàng)建的時(shí)候根據(jù)業(yè)務(wù)邏輯進(jìn)行流量染色。
圖:客戶端染色示意圖
方式二:網(wǎng)關(guān)動(dòng)態(tài)染色(推薦)
動(dòng)態(tài)染色是開(kāi)發(fā)者配置一定的染色規(guī)則,讓流量經(jīng)過(guò)網(wǎng)關(guān)時(shí)自動(dòng)染色,使用起來(lái)相當(dāng)方便。例如把 uid=1 用戶的請(qǐng)求都轉(zhuǎn)發(fā)到 f1 環(huán)境,把 uid=0 用戶的請(qǐng)求都轉(zhuǎn)發(fā)到 f2 環(huán)境。只需要配置一條染色規(guī)則即可實(shí)現(xiàn)。
圖:網(wǎng)關(guān)動(dòng)態(tài)染色示意圖
Spring Cloud Tencent 通過(guò)實(shí)現(xiàn) Spring Cloud Gateway 的 GlobalFilter 來(lái)實(shí)現(xiàn)流量染色插件,開(kāi)發(fā)者只需要添加 spring-cloud-tencent-gateway-plugin 依賴,并在配置文件中打開(kāi)染色插件開(kāi)關(guān)(spring.cloud.tencent.plugin.scg.staining.enabled=true)即可引入流量染色能力。
方式三:網(wǎng)關(guān)靜態(tài)染色
往請(qǐng)求中加入固定的 Header 是網(wǎng)關(guān)最常見(jiàn)的插件,如下圖所示??梢栽诿總€(gè)環(huán)境部署一個(gè)網(wǎng)關(guān),所有經(jīng)過(guò)網(wǎng)關(guān)的請(qǐng)求都增加 X-Polaris-Metadata-Transitive-featureenv=f1 請(qǐng)求頭即可。此種方式需要每個(gè)環(huán)境部署網(wǎng)關(guān),成本高,所以使用頻率相對(duì)較低。
圖:網(wǎng)關(guān)靜態(tài)染色示意圖
完成以上操作步驟即可實(shí)現(xiàn)測(cè)試環(huán)境路由,讀者可運(yùn)行 Spring Cloud Tencent 下 polaris-router-featureenv-example 完整體驗(yàn)。
四、總結(jié)
測(cè)試環(huán)境路由在微服務(wù)架構(gòu)系統(tǒng)的開(kāi)發(fā)階段是非常實(shí)用的功能,能夠大大降低測(cè)試環(huán)境的維護(hù)成本、資源成本,同時(shí)能夠極大的提高研發(fā)效率。通過(guò)操作指引的章節(jié)可以看出通過(guò) Spring Cloud Tencent 實(shí)現(xiàn)測(cè)試環(huán)境路由非常簡(jiǎn)單的,只需要部署的服務(wù)實(shí)例增加相應(yīng)的環(huán)境標(biāo)簽以及在請(qǐng)求頭中增加一個(gè)標(biāo)簽即可。
業(yè)界常見(jiàn)的測(cè)試環(huán)境路由實(shí)現(xiàn)方案往往需要下發(fā)路由規(guī)則給鏈路上的服務(wù),從而實(shí)現(xiàn)路由能力。但是通過(guò)北極星的元數(shù)據(jù)路由能力,整個(gè)方案里無(wú)需下發(fā)任何路由規(guī)則,只需要在實(shí)例設(shè)置相應(yīng)的標(biāo)簽信息即可,操作成本非常低。
如果項(xiàng)目剛好使用 Spring Cloud Gateway 作為網(wǎng)關(guān),那么集成 Spring Cloud Tencent 里的網(wǎng)關(guān)染色插件能夠進(jìn)一步降低流量染色成本,客戶端無(wú)需做任何事情,只需要配置網(wǎng)關(guān)染色規(guī)則即可實(shí)現(xiàn)流量染色。
目前 Spring Cloud Tencent 主要實(shí)現(xiàn)了微服務(wù)之間調(diào)用流量的測(cè)試環(huán)境路由能力,不涉及消息隊(duì)列、任務(wù)調(diào)度的測(cè)試環(huán)境路由能力。
五、歡迎共建
如果您所在項(xiàng)目正在使用 Spring Cloud 框架,并且
沉淀出了非常實(shí)用的通用插件能力和場(chǎng)景化解決方案
目前正遇到一些落地難題
對(duì) Spring Cloud Tencent 項(xiàng)目感興趣
非常歡迎您跟我們一起打磨更多實(shí)用且通用的能力,共建滿足各類實(shí)際生產(chǎn)場(chǎng)景使用的微服務(wù)開(kāi)發(fā)框架。您的一個(gè)建議、Issue、Pull Request 甚至只是一個(gè)小小的 Star 都是對(duì) Spring Cloud Tencent 社區(qū)極大的支持。
Github 地址:https://github.com/Tencent/spring-cloud-tencent
-
路由
+關(guān)注
關(guān)注
0文章
279瀏覽量
42411 -
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
14965 -
Cloud
+關(guān)注
關(guān)注
0文章
73瀏覽量
5607
原文標(biāo)題:如何解決Spring Cloud下測(cè)試環(huán)境路由問(wèn)題
文章出處:【微信號(hào):OSC開(kāi)源社區(qū),微信公眾號(hào):OSC開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
如何用ACM簡(jiǎn)化你的Spring Cloud微服務(wù)環(huán)境配置管理
EDAS再升級(jí)!全面支持Spring Cloud應(yīng)用
使用阿里云ACM簡(jiǎn)化你的Spring Cloud微服務(wù)環(huán)境配置管理
Dubbo Cloud Native 之路的實(shí)踐與思考
使用Spring Cloud與Docker實(shí)戰(zhàn)微服務(wù)

Spring Cloud Function基于Spring Boot的函數(shù)計(jì)算框架

RabbitRpc基于spring cloud的微服務(wù)rpc調(diào)用

Spring Cloud Gateway服務(wù)網(wǎng)關(guān)的部署與使用詳細(xì)教程
Spring Cloud Tencent發(fā)布最新匹配版本!
Spring Cloud 2022.0.0正式發(fā)布
【Spring Cloud 】基于微服務(wù)架構(gòu)的智慧工地監(jiān)管平臺(tái)源碼帶APP

Spring Cloud :打造可擴(kuò)展的微服務(wù)網(wǎng)關(guān)

dubbo和spring cloud區(qū)別
Spring Cloud Gateway網(wǎng)關(guān)框架

評(píng)論