參考:https://blog.csdn.net/yuanyuan_gugu/article/details/107336264
一、Ribbon
客戶端負載均衡組件Ribbon,它是基於 Netflix Ribbon 實現的一套客戶端負載均衡的工具;
Ribbon主要功能是提供客戶端的軟件負載均衡算法,將Netflix的中間服務連接在一起,Ribbon客戶端組件提供一系列完善的配置項,如連接超時,重試等。就是在配置文件中列出Loade Balancer(簡稱LB)后面的所有機器,Ribbon會自動的幫助基於某種規則(輪詢,隨機等)去連接這些機器。也可以使用 Ribbon 實現自定義的負載均衡算法。
1、Ribbon組件來實現負載均衡
(1)maven的坐標引入
<!‐‐加入nocas‐client‐‐> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring‐cloud‐alibaba‐nacos‐discovery</artifactId> </dependency> <!‐‐加入ribbon‐‐> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
(2)在 RestTemplate 上加入 @LoadBalanced 注解
@Configuration public class WebConfig { @LoadBalanced @Bean public RestTemplate restTemplate( ) { return new RestTemplate(); } }
2、Ribbon的負載均衡算法及配置
(1)負載均衡算法
① RoundRobinRule:輪詢選擇,輪詢下標,選擇下標對應位置的Server;
② Random:隨機選擇Server;
③ RetryRule:對選定的負載均衡策略機上重試機制;在一個配置時間段內選擇的Server不成功時,則一直嘗試使用 subRule 的方式選擇一個可用的Server;
④ AvailabilityFilteringRule:過濾掉一直連接失敗的被標記為 circuit tripped (斷路器狀態)的后端Server,並過濾掉那些高並發的后端Server或者使用一個AvailabilityPredicate來包含過濾server的邏輯,其實就就是檢查status里記錄的各個Server的運行狀態。對剩下的使用輪詢策略去訪問。
⑤ BestAvailableRule:會先過濾掉由於多次訪問故障而處於斷路器跳閘狀態(tripped)的Server,然后選擇一個並發量最小的Server
⑥ WeightedResponseTimeRule:根據響應時間加權,響應時間越長,權重越小,被選中的可能性越低;根據平均響應時間計算所有服務的權重,響應時間越快的服務權重越大被選中的概率越大。剛啟動時如果統計信息不足,則使用RoundRobinRule(輪詢)策略,等統計信息足夠,會切換到WeightedResponseTimeRule。
⑦ ZoneAvoidanceRule(默認):復合判斷Server所在Zone的性能和Server的可用性選擇Server,在沒有Zone的情況下類是輪詢。
(2)負載均衡算法的選擇
方式一:注解方式
@Configuration
public class ServerConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean public IRule rule() { return new RandomRule(); }
}
方式二:配置文件的方式
格式:
{server-name}:
ribbon:
NFLoadBalancerRuleClassName: 負載均衡算法對應的全類名
例如:當前服務調用 product-center 服務:
product-center: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
(3)Ribbon 的細粒度配置
例如:Order調用Product服務使用隨機算法,Order調用 Pay服務使用輪詢的算法,這就需要細粒度的配置。
<1>. 使用注解的方式:
ProductRibbonCofig
@Configuration
public class ProductRibbonConfig {
@Bean
public IRule randomRule() {
return new RandomRule();
}
}
PayRibbonConfig
@Configuration
public class PayRibbonConfig {
@Bean
public IRule roundRobinRule() {
return new RoundRobinRule();
}
}
注意:ProductRibbonCofig 和 PayRibbonConfig 類要放在包掃描不能掃到的位置,否則起不到細粒度配置的作用。
@Configuration @RibbonClients(value = { @RibbonClient(name = "product‐center", configuration = ProductRibbonConfig.class), @RibbonClient(name = "pay‐center", configuration = PayRibbonConfig.class) }) public class CustomRibbonConfig { }
<2>. 使用配置文件的方式
# 全局的負載均衡算法使用ZoneAvoidanceRule
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule
# 調用product-center服務使用RandomRule
product-center:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
# 調用pay-center服務使用RoundRobinRule
pay-center:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
說明: 調用product-center服務使用的 Random算法,調用pay-center服務使用 RoundRobinRule 算法,調用其他服務的負載均衡算法使用 ZoneAvoidanceRule。
推薦使用配置文件的方式定義負載均衡算法。
(4)解決Ribbon第一次調用耗時高的問題
開啟飢餓加載:
ribbon:
eager-load:
clients: product-center,pay-center
enabled: true
Ribbon的常用參數
# 每一台服務器重試的次數,不包含首次調用的那一次
ribbon.MaxAutoRetries=1
# 重試的服務器的個數,不包含首次調用的那一台實例
ribbon.MaxAutoRetriesNextServer=2
# 是否對所以的操作進行重試(True 的話 會對post put操作進行重試,存在服務冪等問題)
ribbon.OkToRetryOnAllOperations=false
# 建立連接超時
ribbon.ConnectTimeout=3000
# 讀取數據超時
ribbon.ReadTimeout=3000
Ribbon的詳細配置:http://c.biancheng.net/view/5356.html