當前位置:編程學習大全網 - 源碼破解 - Spring Cloud Gateway負載均衡

Spring Cloud Gateway負載均衡

我們都知道Spring Cloud Gateway是壹個基於Spring Boot、Spring WebFlux、Project Reactor構建的高性能網關,旨在提供簡單、高效的API路由。Spring Cloud Gateway基於Netty運行,因此在傳統Servlet容器中或者打成war包是不能正常運行的。

Gateway有兩種客戶端負載均衡器, LoadBalancerClientFilter 和 ReactiveLoadBalancerClientFilter 。 LoadBalancerClientFilter 使用壹個Ribbon的阻塞式 LoadBalancerClient ,Gateway建議使用 ReactiveLoadBalancerClientFilter 。可以通過設置 spring.cloud.loadbalancer.ribbon.enabled=false ,切換到 ReactiveLoadBalancerClientFilter 。無論使用Ribbon還是LoadBalancer,在Route中配置的lb是壹樣的

官網The LoadBalancerClient Filter

如果URI以lb開頭,比如如上配置中的 lb://user-service ,Spring Cloud Gateway會用 ReactiveLoadBalancerClientFilter 解析服務名為 user-service 的實例對應的實際host和端口,並做集群負載均衡。

官網說用 lb://lakerservice 形式即可,但是配置完成後,並未生效。這個官網沒有詳細說明,查資料也沒有,最後發現必須加入依賴:

Client ----> gateway ----> Ribbion負載均衡 取壹個服務A ---->轉發到服務A

Spring Cloud Ribbon 在高版本移除了

RouteRecordGlobalFilter 這個全局過濾器我們主要用來記錄路由後的實際代理地址,以及調用耗時。我們看下RouteToRequestUrlFilter的描述會發現實際路由地址會通過ServerWebExchange中名為 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR 的屬性保存。

gateway中的自動配置類GatewayLoadBalancerClientAutoConfiguration。

該自動配置類需要在RibbonAutoConfiguration自動配置類之後執行,該類是 spring-cloud-netflix-ribbon 的自動配置類,因此需要引入下面的jar包依賴

使用默認的ribbon,則ribbon的配置如下

官網Spring Cloud LoadBalancer

Spring Cloud Load Balancer並不是壹個獨立的項目,而是spring-cloud-commons其中的壹個模塊,因此很多配置和類可以在spring-cloud-common中找到。gateway中的自動配置類GatewayReactiveLoadBalancerClientAutoConfiguration

Spring Cloud提供了自己的客戶端負載均衡器抽象和實現。對於負載平衡機制,ReactiveLoadBalancer已添加了接口,並為其提供了基於Round-Robin和Random的實現。為了獲得實例以從反應式中進行選擇ServiceInstanceListSupplier 。當前,我們支持基於服務發現的實現,ServiceInstanceListSupplier 該實現使用類路徑中可用的發現客戶端從服務發現中檢索可用實例。

引入依賴:

配置如下:

從配置文件中讀取服務,而不是從服務註冊中心自動發現服務

註意:如果在項目的類路徑下存在Spring Cloud Ribbon相關的類,需要通過配置關閉Ribbon功能,因為Spring Cloud默認優先使用Ribbon,因此spring.cloud.loadbalancer.ribbon.enabled禁用調Ribbon,這也是上面剛提到過的。

官網SimpleDiscoveryClient

SimpleDiscoveryClient可以結合註冊中心使用,也可以靜態配置。如果在類路徑中沒有支持從註冊中心發現服務的DiscoveryClient實例,則將使用SimpleDiscoveryClient實例,該實例使用SimpleDiscoveryProperties來獲取有關服務和實例的信息。參考上面的配置文件中的配置。

SimpleDiscoveryProperties 服務實例的屬性配置

DefaultServiceInstance默認的服務實例定義

ReactiveLoadBalancer默認情況下使用的實現是RoundRobinLoadBalancer。要針對選定的服務或所有服務切換到不同的實現,可以使用自定義LoadBalancer配置機制。例如,可以通過@LoadBalancerClient註釋傳遞以下配置以切換為使用RandomLoadBalancer:

Instance Health-Check for LoadBalancer官網

可以為LoadBalancer啟用計劃健康檢查。為此提供了HealthCheckServiceInstanceListSupplier。它定期驗證委托ServiceInstanceListSupplier提供的實例是否仍然存在,並且只返回健康的實例,除非沒有實例—然後返回所有檢索到的實例。

在使用SimpleDiscoveryClient時,這種機制特別有用。對於由實際服務註冊中心支持的客戶端,不需要使用它,因為我們在查詢外部ServiceDiscovery之後已經獲得了健康的實例。

對於每個服務只有少量實例的設置,也建議使用此供應商,以避免重試調用失敗的實例。

  • 上一篇:我人生中的第壹次下墓!觀田義墓有感
  • 下一篇:12306搶票助手是官方的嗎?
  • copyright 2024編程學習大全網