SpringCloud中怎么定制路由功能

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

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),華池企業(yè)網(wǎng)站建設(shè),華池品牌網(wǎng)站建設(shè),網(wǎng)站定制,華池網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,華池網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

使用API網(wǎng)關(guān)可統(tǒng)一流量入口,對(duì)客戶(hù)端屏蔽內(nèi)部多個(gè)微服務(wù)的域名,實(shí)現(xiàn)負(fù)載均衡,并可以統(tǒng)一鑒權(quán)、接口訪(fǎng)問(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的依賴(lài),所以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中怎么定制路由功能

在了解路由失效的原因后、在嘗試依賴(lài)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)路由功能相比于依賴(lài)一堆無(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提供訪(fǎng)問(wèn)kubernetes資源的客戶(hù)端接口定時(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)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

分享名稱(chēng):SpringCloud中怎么定制路由功能
當(dāng)前網(wǎng)址:http://muchs.cn/article40/jcpseo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷(xiāo)、云服務(wù)器、定制開(kāi)發(fā)、響應(yīng)式網(wǎng)站品牌網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)