您好,登錄后才能下訂單哦!
這篇文章主要講解了“Spring Cloud中怎么定制路由功能”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Spring Cloud中怎么定制路由功能”吧!
使用API網關可統一流量入口,對客戶端屏蔽內部多個微服務的域名,實現負載均衡,并可以統一鑒權、接口訪問控制、流量管控。
作為網關,代理了所有流量,對性能要求更高,介于網關核心功能是路由、代理后端服務,主要處理請求轉發,如果使用同步阻塞方式,后端接口響應耗時越長,對網關性能的影響就越大。nginx作為反向代理中的佼佼者,基于nginx開發的Kong網關性能更是毋庸置疑。但作為內部網關,我們需要更好的定制,選擇Java系的網關對我們來說更容易駕馭。
在選定編程語言后,我們就需要考慮性能問題。而網關的性能損耗無非就是I/O阻塞,只有純異步才能有更好的性能表現,所以我們選擇至少是基于實現Reactive Streams規范的反應式編程庫開發的網關。
Spring cloud gateway作為spring cloud生態系統中的網關,基于Spring Boot、Project Reactor開發,不僅實現異步非阻塞,并且更快速與spring cloud生態中的其它組件整合,這是我們選擇Spring cloud gateway的原因。
我們基于Spring Cloud Gateway開發內部微服務網關,并結合注冊中心實現自動服務發現路由。
就在最近將項目部署測試環境的Kubernetes集群上時,發現路由失敗。經調試源碼發現是因為沒有導入Ribbon的依賴,所以Gateway注冊的是非負載均衡路由過濾器(NoLoadBalancerClientFilter),當路由規則配置以"lb://"開頭時,該路由過濾器直接響應503(目標服務不可達)。
Gateway使用全局過濾器實現路由功能,其按照全局過濾器指定的排序值順序調用,每個過濾器都可終止請求的調用。
Gateway允許每個全局過濾器重寫路由URL,通過將重寫后的URL更新到請求的attribute向下傳遞,下游過濾器可重新修改路由URL,最初的路由URL從路由規則取得。
// 從ServerWebExchange#getAttribute取得路由urlURI url = exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR);
Gateway使用一個鏈表將每個過濾器替換前的路由URL串起來,如果想獲取URL被替換為目標服務URL過程的變化,可獲取該鏈表、遍歷該鏈表。
// 記錄修改前的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接收到一個請求后,請求從FilteringWebHandler傳送到全局過濾器鏈上(GatewayFilterChain),在過濾器鏈上向下傳遞,經過中間過濾器將請求URL替換后,由最后的請求轉發過濾器(ForwardRoutingFilter)將請求交給DispatcherHandler向目標服務發起請求并將結果響應給調用端。
在了解路由失效的原因后、在嘗試依賴Ribbon的starter包依然路由失敗后,筆者決定自己實現路由功能,并使用Ribbon實現的負載均衡算法在網關實現負載均衡。
由于項目是基于Spring Cloud Kubernetes開發的微服務項目,使用Kubernetes云原生服務作為“注冊中心”,服務無需注冊,可通過kubernete API讀取Service或Endpoints資源,并且spring-cloud-kubernete-core提供了讀取Service或Endpoints資源的API,因此自己實現路由功能相比于依賴一堆無關緊要的jar包更輕量。
負載均衡功能是次要的,如果不需要在網關實現負載均衡,則可以將服務發現模式改為Service,讀取Kubernetes中的Service資源的Cluster IP;如果想要在網關實現負載均衡,而可以將服務發現模式改為Pod,讀取Kubernetes的Endpoints資源。
自實現路由功能分為以下幾個步驟:
1、使用spring cloud kubernetes core提供訪問kubernetes資源的客戶端接口定時拉取服務目錄緩存到本地;
2、自實現負載均衡算法,或使用Ribbon的ribbon-loadbalancer包提供的負載均衡算法(IRule),每次路由根據算法從服務列表中選擇一個節點調用;
3、自定義實現理由功能的全局過濾器(GlobalFilter),指定該過濾器排在Gateway注冊的非負載均衡過濾器之前,在它之前完成將url中的“lb://serviceId”替換為"http://ip:port"。
感謝各位的閱讀,以上就是“Spring Cloud中怎么定制路由功能”的內容了,經過本文的學習后,相信大家對Spring Cloud中怎么定制路由功能這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。