SpringCloud升級之路2020.0.x版-21.Spring Cloud LoadBalancer簡介

乾貨滿滿張雜湊發表於2021-08-26

本系列程式碼地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford

我們使用 Spring Cloud 官方推薦的 Spring Cloud LoadBalancer 作為我們的客戶端負載均衡器。

Spring Cloud LoadBalancer背景

Spring Cloud LoadBalancer是一個客戶端負載均衡器,類似於Ribbon,但是由於Ribbon已經進入維護模式,並且Ribbon 2並不與Ribbon 1相互相容,所以Spring Cloud全家桶在Spring Cloud Commons專案中,新增了Spring cloud Loadbalancer作為新的負載均衡器,並且做了向前相容,就算你的專案中繼續用 Spring Cloud Netflix 套裝(包括Ribbon,Eureka,Zuul,Hystrix等等)讓你的專案中有這些依賴,你也可以通過簡單的配置,把ribbon替換成Spring Cloud LoadBalancer。

負載均衡器在哪裡使用?

Spring Cloud 中內部微服務呼叫預設是 http 請求,主要通過下面三種 API:

  • RestTemplate:同步 http API
  • WebClient:非同步響應式 http API
  • 三方客戶端封裝,例如 openfeign

如果專案中加入了 spring-cloud-loadbalancer 的依賴並且配置啟用了,那麼會自動在相關的 Bean 中加入負載均衡器的特性。

  • 對於 RestTemplate,會自動對所有 @LoadBalanced 註解修飾的 RestTemplate Bean 增加 Interceptor 從而加上了負載均衡器的特性。
  • 對於 WebClient,會自動建立 ReactorLoadBalancerExchangeFilterFunction,我們可以通過加入ReactorLoadBalancerExchangeFilterFunction會加入負載均衡器的特性。
  • 對於三方客戶端,一般不需要我們額外配置什麼。

這些使用的示例,會在我們系列升級完最後的測試部分看到。

Spring Cloud LoadBalancer 結構簡介

系列之前的文章我們提到了 NamedContextFactory,Spring Cloud LoadBalancer 這裡也是使用了這個機制實現了不同微服務使用不同的 Spring Cloud LoadBalancer 配置。相關核心實現是 @LoadBalancerClient@LoadBalancerClients 這兩個註解,以及 NamedContextFactory.Specification 的實現 LoadBalancerClientSpecificationNamedContextFactory 的實現 LoadBalancerClientFactory。如下圖所示:

  1. 可以通過 loadbalancer.client.name 這個屬性獲取當前要建立的 Bean 是哪個微服務的
  2. 可以知道預設配置是 LoadBalancerClientConfiguration,再檢視它裡面的原始碼我們可以知道主要初始化兩個 Bean:
    1. ReactorLoadBalancer,負載均衡器,因為有 @ConditionalOnMissingBean 所以可以被替換,這就是我們的擴充套件點
    2. ServiceInstanceSupplier,提供例項資訊的 Supplier,因為有 @ConditionalOnMissingBean 所以可以被替換,這就是我們的擴充套件點
  3. Specification 為 LoadBalancerSpecification,再分析其呼叫可以知道,可以通過 @LoadBalancerClient@LoadBalancerClientsLoadBalancerClientConfiguration 的基礎上額外指定配置。

我們這一節簡要介紹了 Spring Cloud LoadBalancer 的使用場景,以及結構設計和擴充套件點。下一節我們將詳細分析 Spring Cloud LoadBalancer 的原始碼來理解其中的原理。

微信搜尋“我的程式設計喵”關注公眾號,每日一刷,輕鬆提升技術,斬獲各種offer

相關文章