前言
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)景的解決方案?,F(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外掛本地磁盤(pán)上
方式二:環(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文章
278瀏覽量
41843 -
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
14343 -
Cloud
+關(guān)注
關(guān)注
0文章
68瀏覽量
5355
原文標(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)先 登錄
相關(guān)推薦
評(píng)論