跟我學Spring Cloud(Finchley版)-08-Ribbon深入
上一節講了Ribbon的入門姿勢,本節深入探討Ribbon的高階特性。
內建負載均衡規則
負載均衡規則是Ribbon的核心,下面來看一下Ribbon內建的負載均衡規則。
- AvailabilityFilteringRule:過濾掉一直連線失敗的被標記為circuit tripped的後端Server,並過濾掉那些高併發的後端Server或者使用一個AvailabilityPredicate來包含過濾server的邏輯,其實就就是檢查status裡記錄的各個Server的執行狀態;
- BestAvailableRule:選擇一個最小的併發請求的Server,逐個考察Server,如果Server被tripped了,則跳過。
- RandomRule:隨機選擇一個Server;
- ResponseTimeWeightedRule:作用同WeightedResponseTimeRule,二者作用一樣;
- RetryRule:對選定的負載均衡策略機上重試機制,在一個配置時間段內當選擇Server不成功,則一直嘗試使用subRule的方式選擇一個可用的server;
- RoundRobinRule:輪詢選擇, 輪詢index,選擇index對應位置的Server;
- WeightedResponseTimeRule:根據響應時間加權,響應時間越長,權重越小,被選中的可能性越低;
- ZoneAvoidanceRule:複合判斷Server所在區域的效能和Server的可用性選擇Server;
如需自定義負載均衡規則,只需實現IRule 介面或繼承AbstractLoadBalancerRule、PredicateBasedRule即可 ,讀者可參考RandomRule
、RoundRobinRule
、ZoneAvoidanceRule
等內建Rule編寫自己的負載均衡規則。
Ribbon配置自定義【細粒度配置】
Ribbon可實現精確到目標服務的細粒度配置。例如A服務呼叫服務B,A服務呼叫C,可以針對B服務一套配置,針對C服務另一套配置。
方式1、程式碼配置方式
在Spring Cloud中,Ribbon的預設配置如下(格式是BeanType
beanName: ClassName
):
-
IClientConfig
ribbonClientConfig:DefaultClientConfigImpl
-
IRule
ribbonRule:ZoneAvoidanceRule
-
IPing
ribbonPing:NoOpPing
-
ServerList<Server>
ribbonServerList:ConfigurationBasedServerList
-
ServerListFilter<Server>
ribbonServerListFilter:ZonePreferenceServerListFilter
-
ILoadBalancer
ribbonLoadBalancer:ZoneAwareLoadBalancer
-
ServerListUpdater
ribbonServerListUpdater:PollingServerListUpdater
程式碼示例
-
建立一個空類,並在其上新增
@Configuration
註解和@RibbonClient
註解。/** * 使用RibbonClient,為特定的目標服務自定義配置。 * 使用@RibbonClient的configuration屬性,指定Ribbon的配置類。 * 可參考的示例: * http://spring.io/guides/gs/client-side-load-balancing/ * @author 周立 */ @Configuration @RibbonClient(name = "microservice-provider-user", configuration = RibbonConfiguration.class) public class TestConfiguration { }
由程式碼可知,使用
@RibbonClient
註解的configuration屬性,即可自定義指定名稱Ribbon客戶端的配置。 -
建立Ribbon的配置類。
/** * 該類為Ribbon的配置類 * 注意:該類不能放在主應用程式上下文@ComponentScan所掃描的包中,否則配置將會被所有Ribbon Client共享。 * @author 周立 */ @Configuration public class RibbonConfiguration { @Bean public IRule ribbonRule() { // 負載均衡規則,改為隨機 return new RandomRule(); } }
配套程式碼
方式2、屬性配置方式【推薦】
<clientName>.ribbon.
如下屬性
-
NFLoadBalancerClassName
: should implementILoadBalancer
-
NFLoadBalancerRuleClassName
: should implementIRule
-
NFLoadBalancerPingClassName
: should implementIPing
-
NIWSServerListClassName
: should implementServerList
-
NIWSServerListFilterClassName
should implementServerListFilter
程式碼示例
user:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
TIPS
屬性配置的優先順序高於程式碼配置。
配套程式碼
Ribbon配置自定義【全域性配置】
方式1、程式碼配置方式
@RibbonClients(defaultConfiguration = DefaultRibbonConfig.class)
public class RibbonClientDefaultConfigurationTestsConfig {
}
@Configuration
class DefaultRibbonConfig {
@Bean
public IRule ribbonRule() {
return new RandomRule();
}
}
方法2、屬性配置方式【推薦】
和上文細粒度配置類似,只需將目標服務名稱字首去掉即可。
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
Ribbon Eager載入
預設情況下Ribbon是懶載入的——首次請求Ribbon相關類才會初始化,這會導致首次請求過慢的問題,你可以配置飢餓載入,讓Ribbon在應用啟動時就初始化。
ribbon:
eager-load:
enabled: true
# 多個用,分隔
clients: microservice-provider-user
本文首發
http://www.itmuch.com/spring-cloud/finchley-8/
乾貨分享
相關文章
- 跟我學Spring Cloud(Finchley版)-06-服務註冊與SpringCloud
- 跟我學Spring Cloud(Finchley版)-03-監控:強大的Spring Boot ActuatorCloudSpring Boot
- Spring Cloud Config 分散式配置中心【Finchley 版】SpringCloud分散式
- 跟我學SpringCloud | 第十二篇:Spring Cloud Gateway初探SpringGCCloudGateway
- Spring Cloud Finchley版中Consul多例項註冊的問題處理SpringCloud
- 跟我學SpringCloud | 第六篇:Spring Cloud Config Github配置中心SpringGCCloudGithub
- Spring Cloud Gateway 深入SpringCloudGateway
- 升級Spring Cloud到Finchley後的一點坑SpringCloud
- 跟我學SpringCloud | 第十四篇:Spring Cloud Gateway高階應用SpringGCCloudGateway
- Spring Cloud Finchley.SR3包含重大升級SpringCloud
- 跟我學SpringCloud | 第八篇:Spring Cloud Bus 訊息匯流排SpringGCCloud
- 跟我學Spring Cloud(2020.0.0-M6版)-01-服務註冊與服務發現-Eureka ServerSpringCloudServer
- oAuth2 升級Spring Cloud Finchley.RELEASE踩坑分享OAuthSpringCloud
- Spring Cloud學習SpringCloud
- Spring Cloud服務框架版本升級--JDK10+Gradle4.9+Spring Boot 2.0+Finchley.SR1Cloud框架JDKGradleSpring Boot
- java版spring cloud+spring cloud 工程管理系統原始碼JavaSpringCloud原始碼
- 跟我學SpringCloud | 第十一篇:使用Spring Cloud Sleuth和Zipkin進行分散式鏈路跟蹤SpringGCCloud分散式
- 業餘草 SpringCloud教程 | 第六篇: 分散式配置中心(Spring Cloud Config)(Finchley版本)SpringGCCloud分散式
- 業餘草 SpringCloud教程 | 第八篇: 訊息匯流排(Spring Cloud Bus)(Finchley版本)SpringGCCloud
- java版電子商務spring cloud分散式微服務-大話Spring CloudJavaSpringCloud分散式微服務
- Spring Cloud認知學習(一):Spring Cloud介紹與Eureka使用SpringCloud
- 深入研究Spring Cloud負載平衡器 – PiotrSpringCloud負載
- Spring Cloud(二):Spring Cloud ConfigSpringCloud
- 業餘草 SpringCloud教程 | 第九篇: 服務鏈路追蹤(Spring Cloud Sleuth)(Finchley版本)SpringGCCloud
- Spring Cloud 學習筆記 ——Spring Cloud Config 請求失敗重試SpringCloud筆記
- Spring Cloud Eureka 學習記錄SpringCloud
- Spring Cloud學習總結(一)SpringCloud
- SpringCloud學習(十五)---Spring Cloud FunctionSpringGCCloudFunction
- Spring Kafka深入學習分析SpringKafka
- Spring Cloud 關於:Spring Cloud Netflix HystrixSpringCloud
- 業餘草 SpringCloud教程 | 第七篇: 高可用的分散式配置中心(Spring Cloud Config)(Finchley版本)SpringGCCloud分散式
- SpringCloud分散式微服務雲架構 第八篇: 訊息匯流排(Spring Cloud Bus)(Finchley版本)SpringGCCloud分散式微服務架構
- java版spring cloud工程管理系統原始碼JavaSpringCloud原始碼
- spring cloud分散式微服務:Spring Cloud ConfigSpringCloud分散式微服務
- spring cloud 和 阿里微服務spring cloud AlibabaSpringCloud阿里微服務
- 跟我學 “Linux” 小程式 Web 版開發(一):初始化LinuxWeb
- 跟我學 “Linux” 小程式 Web 版開發(二):UI 開發LinuxWebUI
- spring cloud Alibaba 之 spring boot 基礎學習筆記CloudSpring Boot筆記