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


本系列代碼地址: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM