路由方式概述
目前,云原生API網(wǎng)關(guān)支持多種路由方式,包括單服務(wù)、按比例路由、按標(biāo)簽路由、Mock和重定向。
單服務(wù)路由
在該模式下,可以將請(qǐng)求轉(zhuǎn)發(fā)到后端某個(gè)具體的服務(wù)。關(guān)于云原生API網(wǎng)關(guān)服務(wù)的設(shè)置,請(qǐng)參見(jiàn)管理服務(wù)。
網(wǎng)關(guān)根據(jù)配置的路由規(guī)則進(jìn)行匹配,例如:
匹配/user路由規(guī)則的請(qǐng)求,轉(zhuǎn)發(fā)到用戶服務(wù)。
匹配/order路由規(guī)則的請(qǐng)求,轉(zhuǎn)發(fā)到訂單服務(wù)。
按比例路由
在該模式下,可以將請(qǐng)求轉(zhuǎn)發(fā)到后端多個(gè)不同的服務(wù),流量按照配置的權(quán)重進(jìn)行分流。您可以在以下場(chǎng)景中選擇多服務(wù)類型:
不同的注冊(cè)中心
在業(yè)務(wù)發(fā)展過(guò)程中,內(nèi)部架構(gòu)對(duì)于注冊(cè)中心的選型可能隨著新技術(shù)的迭代而進(jìn)行更換。在注冊(cè)中心選型遷移的過(guò)程中,為了保證流量無(wú)損,平滑穩(wěn)定的升級(jí),一般會(huì)冗余部署服務(wù)并將服務(wù)的注冊(cè)中心更換為新的注冊(cè)中心,同時(shí)保留舊服務(wù)和舊注冊(cè)中心。之后逐步將流量從舊服務(wù)分流到新服務(wù),這個(gè)過(guò)程一般耗時(shí)較久,待新服務(wù)穩(wěn)定后,就可以將流量全部轉(zhuǎn)發(fā)到采用新注冊(cè)中心的服務(wù)。同時(shí),要支持可回滾,一旦新服務(wù)的狀態(tài)不符合預(yù)期,您可以隨時(shí)將流量回滾到舊服務(wù)。
例如,以下應(yīng)用系統(tǒng)中的用戶服務(wù)原來(lái)使用的是Nacos中心,現(xiàn)在希望將注冊(cè)中心切換到K8s內(nèi)置的CoreDNS方案(需結(jié)合Service資源一起使用)。
不同的運(yùn)維體系
傳統(tǒng)的業(yè)務(wù)服務(wù)大多數(shù)部署在虛擬機(jī)上,例如阿里云ECS。隨著易運(yùn)維、高彈性的K8s技術(shù)的興起,越來(lái)越多的業(yè)務(wù)開(kāi)始將業(yè)務(wù)逐步遷移至K8s運(yùn)維平臺(tái),例如阿里云ACK。為了保證遷移過(guò)程中流量無(wú)損,一般會(huì)在K8s集群上冗余部署服務(wù),以新的服務(wù)名注冊(cè)到注冊(cè)中心上。此時(shí),注冊(cè)中心會(huì)出現(xiàn)兩個(gè)功能相同的服務(wù),ECS上部署運(yùn)行的用戶服務(wù)以及K8s上部署運(yùn)行的用戶服務(wù)。之后逐步將流量從ECS上的服務(wù)分流到K8s上的服務(wù),期間可以隨時(shí)調(diào)整流量權(quán)重和回滾。
例如,以下應(yīng)用系統(tǒng)中的以Nacos作為注冊(cè)中心的用戶服務(wù),希望將ECS上的用戶服務(wù)遷移至阿里云ACK平臺(tái)。
按標(biāo)簽路由
在該模式下,可以將請(qǐng)求轉(zhuǎn)發(fā)到相同或不同服務(wù)的不同版本,流量按照配置的權(quán)重進(jìn)行分流。關(guān)于云原生API網(wǎng)關(guān)服務(wù)版本的設(shè)置,請(qǐng)參見(jiàn)管理服務(wù)版本。您可以在以下場(chǎng)景中選擇多服務(wù)類型:
金絲雀發(fā)布
在服務(wù)持續(xù)迭代發(fā)展過(guò)程中,頻繁存在服務(wù)新版本發(fā)布上線的需求,為了確保流量在服務(wù)升級(jí)過(guò)程中平穩(wěn)無(wú)損,開(kāi)發(fā)者經(jīng)常會(huì)使用金絲雀發(fā)布手段來(lái)將小部分流量分發(fā)到新版本進(jìn)行驗(yàn)證,驗(yàn)證符合預(yù)期后,逐步將流量從老版本完全遷移至新版本。
例如,以下應(yīng)用系統(tǒng)中以K8s容器服務(wù)作為服務(wù)發(fā)現(xiàn)的用戶服務(wù),服務(wù)的當(dāng)前版本為v1,現(xiàn)在服務(wù)的新版本v2要發(fā)布上線。有兩種方式可以進(jìn)行金絲雀發(fā)布:
按比例
現(xiàn)有的路由/user,目標(biāo)服務(wù)類型為標(biāo)簽路由,轉(zhuǎn)發(fā)至用戶服務(wù)v1版本。在服務(wù)管理中為用戶服務(wù)添加v2版本,之后在當(dāng)前路由的標(biāo)簽路由中新增一個(gè)目標(biāo)服務(wù)(用戶服務(wù)v2版本),您可以配置權(quán)重來(lái)決定轉(zhuǎn)發(fā)至v2版本的流量比例。
按標(biāo)簽
現(xiàn)有的路由/user,目標(biāo)服務(wù)類型為標(biāo)簽路由,轉(zhuǎn)發(fā)至用戶服務(wù)v1版本。新增一條路由/user,添加灰度標(biāo)識(shí),例如Header名為stage,Header值為gray,轉(zhuǎn)發(fā)至用戶服務(wù)v2版本。
標(biāo)簽路由
在實(shí)際業(yè)務(wù)中,有的服務(wù)本身長(zhǎng)期存在多個(gè)版本,各個(gè)版本之間功能也有差異,分別應(yīng)用于有特定信息的請(qǐng)求。例如對(duì)于同一個(gè)API,帶有某個(gè)Header值的請(qǐng)求必須訪問(wèn)服務(wù)的某個(gè)版本。另一個(gè)場(chǎng)景是多套開(kāi)發(fā)環(huán)境(測(cè)試、預(yù)發(fā)和生產(chǎn)),利用服務(wù)版本可以根據(jù)請(qǐng)求的信息來(lái)決定分發(fā)到哪個(gè)開(kāi)發(fā)環(huán)境。
例如,以下應(yīng)用系統(tǒng)中以K8s容器服務(wù)作為服務(wù)發(fā)現(xiàn)的用戶服務(wù),有三套開(kāi)發(fā)環(huán)境(test、pre和online)。對(duì)于/user的請(qǐng)求設(shè)置如下:
Header stage的值為test,流量轉(zhuǎn)發(fā)至用戶服務(wù)的測(cè)試版本。
Header stage的值為pre,流量轉(zhuǎn)發(fā)至用戶服務(wù)的預(yù)發(fā)版本。
Header stage的值為online,流量轉(zhuǎn)發(fā)至用戶服務(wù)的正式版本。
高可用部署
為了保證服務(wù)的可用性,服務(wù)可以部署在不同的K8s集群中,我們可以根據(jù)節(jié)點(diǎn)上與集群相關(guān)的元數(shù)據(jù)信息對(duì)服務(wù)所有實(shí)例按集群維度進(jìn)行版本管理,并且可以調(diào)整分發(fā)到各個(gè)集群(各個(gè)服務(wù)版本)的流量權(quán)重。當(dāng)某個(gè)集群出現(xiàn)故障時(shí),設(shè)置分發(fā)到該集群的流量權(quán)重為0,即可達(dá)到流量切換目的。
例如,以下應(yīng)用系統(tǒng)中以K8s容器服務(wù)作為服務(wù)發(fā)現(xiàn)的用戶服務(wù),部署在兩個(gè)不同的ACK集群中,集群A和集群B。對(duì)于/user的路由請(qǐng)求流量,希望80%的流量轉(zhuǎn)發(fā)至集群A中部署的用戶服務(wù),20%的流量轉(zhuǎn)發(fā)至集群B中部署的用戶服務(wù)。
Mock路由
該模式多用于調(diào)試的場(chǎng)景,通過(guò)為路由設(shè)置一個(gè)固定的響應(yīng)來(lái)驗(yàn)證請(qǐng)求的匹配條件是否符合預(yù)期,方便前端和后端并行開(kāi)發(fā),加快業(yè)務(wù)迭代速度。
例如,以下應(yīng)用系統(tǒng)的用戶服務(wù),在后端用戶服務(wù)未開(kāi)發(fā)完成之前,可以對(duì)用戶服務(wù)的API設(shè)置一個(gè)固定的響應(yīng),方便前端開(kāi)發(fā)用來(lái)調(diào)試。待后端的用戶服務(wù)開(kāi)發(fā)完畢之后,可以將Mock類型改為真實(shí)的用戶服務(wù),從而完成真正的前后端聯(lián)調(diào)。
重定向路由
在該模式下,可以將請(qǐng)求重定向到另一個(gè)域名或另一個(gè)路徑。通常用于業(yè)務(wù)的域名遷移、API變動(dòng)的場(chǎng)景。
例如,業(yè)務(wù)域名為old.example.com,Path為/test的請(qǐng)求訪問(wèn)云原生API網(wǎng)關(guān),被網(wǎng)關(guān)重定向?yàn)閚ew.example.com/dev。