溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Cloud中怎么定制路由功能

發(fā)布時(shí)間:2021-12-22 11:30:28 來(lái)源:億速云 閱讀:275 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“Spring Cloud中怎么定制路由功能”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Spring Cloud中怎么定制路由功能”吧!

使用API網(wǎng)關(guān)可統(tǒng)一流量入口,對(duì)客戶端屏蔽內(nèi)部多個(gè)微服務(wù)的域名,實(shí)現(xiàn)負(fù)載均衡,并可以統(tǒng)一鑒權(quán)、接口訪問(wèn)控制、流量管控。

作為網(wǎng)關(guān),代理了所有流量,對(duì)性能要求更高,介于網(wǎng)關(guān)核心功能是路由、代理后端服務(wù),主要處理請(qǐng)求轉(zhuǎn)發(fā),如果使用同步阻塞方式,后端接口響應(yīng)耗時(shí)越長(zhǎng),對(duì)網(wǎng)關(guān)性能的影響就越大。nginx作為反向代理中的佼佼者,基于nginx開(kāi)發(fā)的Kong網(wǎng)關(guān)性能更是毋庸置疑。但作為內(nèi)部網(wǎng)關(guān),我們需要更好的定制,選擇Java系的網(wǎng)關(guān)對(duì)我們來(lái)說(shuō)更容易駕馭。

在選定編程語(yǔ)言后,我們就需要考慮性能問(wèn)題。而網(wǎng)關(guān)的性能損耗無(wú)非就是I/O阻塞,只有純異步才能有更好的性能表現(xiàn),所以我們選擇至少是基于實(shí)現(xiàn)Reactive Streams規(guī)范的反應(yīng)式編程庫(kù)開(kāi)發(fā)的網(wǎng)關(guān)。

Spring cloud gateway作為spring cloud生態(tài)系統(tǒng)中的網(wǎng)關(guān),基于Spring Boot、Project Reactor開(kāi)發(fā),不僅實(shí)現(xiàn)異步非阻塞,并且更快速與spring cloud生態(tài)中的其它組件整合,這是我們選擇Spring cloud gateway的原因。

我們基于Spring Cloud Gateway開(kāi)發(fā)內(nèi)部微服務(wù)網(wǎng)關(guān),并結(jié)合注冊(cè)中心實(shí)現(xiàn)自動(dòng)服務(wù)發(fā)現(xiàn)路由。

就在最近將項(xiàng)目部署測(cè)試環(huán)境的Kubernetes集群上時(shí),發(fā)現(xiàn)路由失敗。經(jīng)調(diào)試源碼發(fā)現(xiàn)是因?yàn)闆](méi)有導(dǎo)入Ribbon的依賴,所以Gateway注冊(cè)的是非負(fù)載均衡路由過(guò)濾器(NoLoadBalancerClientFilter),當(dāng)路由規(guī)則配置以"lb://"開(kāi)頭時(shí),該路由過(guò)濾器直接響應(yīng)503(目標(biāo)服務(wù)不可達(dá))。

Gateway使用全局過(guò)濾器實(shí)現(xiàn)路由功能,其按照全局過(guò)濾器指定的排序值順序調(diào)用,每個(gè)過(guò)濾器都可終止請(qǐng)求的調(diào)用。

Gateway允許每個(gè)全局過(guò)濾器重寫(xiě)路由URL,通過(guò)將重寫(xiě)后的URL更新到請(qǐng)求的attribute向下傳遞,下游過(guò)濾器可重新修改路由URL,最初的路由URL從路由規(guī)則取得。

// 從ServerWebExchange#getAttribute取得路由urlURI url = exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR);

Gateway使用一個(gè)鏈表將每個(gè)過(guò)濾器替換前的路由URL串起來(lái),如果想獲取URL被替換為目標(biāo)服務(wù)URL過(guò)程的變化,可獲取該鏈表、遍歷該鏈表。

// 記錄修改前的urladdOriginalRequestUrl(exchange, url);// public static void addOriginalRequestUrl(ServerWebExchange exchange, URI url) {    exchange.getAttributes().computeIfAbsent(GATEWAY_ORIGINAL_REQUEST_URL_ATTR,        s -> new LinkedHashSet<>());    LinkedHashSet<URI> uris = exchange        .getRequiredAttribute(GATEWAY_ORIGINAL_REQUEST_URL_ATTR);    uris.add(url);}

Gateway接收到一個(gè)請(qǐng)求后,請(qǐng)求從FilteringWebHandler傳送到全局過(guò)濾器鏈上(GatewayFilterChain),在過(guò)濾器鏈上向下傳遞,經(jīng)過(guò)中間過(guò)濾器將請(qǐng)求URL替換后,由最后的請(qǐng)求轉(zhuǎn)發(fā)過(guò)濾器(ForwardRoutingFilter)將請(qǐng)求交給DispatcherHandler向目標(biāo)服務(wù)發(fā)起請(qǐng)求并將結(jié)果響應(yīng)給調(diào)用端。

Spring Cloud中怎么定制路由功能

在了解路由失效的原因后、在嘗試依賴Ribbon的starter包依然路由失敗后,筆者決定自己實(shí)現(xiàn)路由功能,并使用Ribbon實(shí)現(xiàn)的負(fù)載均衡算法在網(wǎng)關(guān)實(shí)現(xiàn)負(fù)載均衡。

由于項(xiàng)目是基于Spring Cloud Kubernetes開(kāi)發(fā)的微服務(wù)項(xiàng)目,使用Kubernetes云原生服務(wù)作為“注冊(cè)中心”,服務(wù)無(wú)需注冊(cè),可通過(guò)kubernete API讀取Service或Endpoints資源,并且spring-cloud-kubernete-core提供了讀取Service或Endpoints資源的API,因此自己實(shí)現(xiàn)路由功能相比于依賴一堆無(wú)關(guān)緊要的jar包更輕量。

負(fù)載均衡功能是次要的,如果不需要在網(wǎng)關(guān)實(shí)現(xiàn)負(fù)載均衡,則可以將服務(wù)發(fā)現(xiàn)模式改為Service,讀取Kubernetes中的Service資源的Cluster IP;如果想要在網(wǎng)關(guān)實(shí)現(xiàn)負(fù)載均衡,而可以將服務(wù)發(fā)現(xiàn)模式改為Pod,讀取Kubernetes的Endpoints資源。

自實(shí)現(xiàn)路由功能分為以下幾個(gè)步驟:

  • 1、使用spring cloud kubernetes core提供訪問(wèn)kubernetes資源的客戶端接口定時(shí)拉取服務(wù)目錄緩存到本地;

  • 2、自實(shí)現(xiàn)負(fù)載均衡算法,或使用Ribbon的ribbon-loadbalancer包提供的負(fù)載均衡算法(IRule),每次路由根據(jù)算法從服務(wù)列表中選擇一個(gè)節(jié)點(diǎn)調(diào)用;

  • 3、自定義實(shí)現(xiàn)理由功能的全局過(guò)濾器(GlobalFilter),指定該過(guò)濾器排在Gateway注冊(cè)的非負(fù)載均衡過(guò)濾器之前,在它之前完成將url中的“l(fā)b://serviceId”替換為"http://ip:port"。

Spring Cloud中怎么定制路由功能

感謝各位的閱讀,以上就是“Spring Cloud中怎么定制路由功能”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Spring Cloud中怎么定制路由功能這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI