中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Cloud中怎么定制路由功能

發布時間:2021-12-22 11:30:28 來源:億速云 閱讀:281 作者:iii 欄目:大數據

這篇文章主要講解了“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向目標服務發起請求并將結果響應給調用端。

Spring Cloud中怎么定制路由功能

在了解路由失效的原因后、在嘗試依賴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中怎么定制路由功能”的內容了,經過本文的學習后,相信大家對Spring Cloud中怎么定制路由功能這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西和县| 固安县| 平谷区| 蒙自县| 恭城| 普安县| 乌兰察布市| 郁南县| 长沙县| 新建县| 新竹县| 大足县| 西峡县| 晋州市| 象州县| 共和县| 松滋市| 海丰县| 河北区| 塔河县| 枝江市| 乐平市| 普定县| 正蓝旗| 嵊州市| 朝阳县| 长武县| 疏附县| 镇原县| 罗平县| 乳山市| 兴化市| 女性| 永宁县| 象州县| 汝南县| 拜泉县| 明星| 芒康县| 海阳市| 古交市|