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