本系列代碼地址: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
的實現 LoadBalancerClientSpecification
,NamedContextFactory
的實現 LoadBalancerClientFactory
。如下圖所示:
- 可以通過
loadbalancer.client.name
這個屬性獲取當前要創建的 Bean 是哪個微服務的 - 可以知道默認配置是
LoadBalancerClientConfiguration
,再查看它里面的源代碼我們可以知道主要初始化兩個 Bean:- ReactorLoadBalancer,負載均衡器,因為有
@ConditionalOnMissingBean
所以可以被替換,這就是我們的擴展點 - ServiceInstanceSupplier,提供實例信息的 Supplier,因為有
@ConditionalOnMissingBean
所以可以被替換,這就是我們的擴展點
- ReactorLoadBalancer,負載均衡器,因為有
- Specification 為 LoadBalancerSpecification,再分析其調用可以知道,可以通過
@LoadBalancerClient
和@LoadBalancerClients
在LoadBalancerClientConfiguration
的基礎上額外指定配置。
我們這一節簡要介紹了 Spring Cloud LoadBalancer 的使用場景,以及結構設計和擴展點。下一節我們將詳細分析 Spring Cloud LoadBalancer 的源代碼來理解其中的原理。
微信搜索“我的編程喵”關注公眾號,每日一刷,輕松提升技術,斬獲各種offer: