Ribbon飢餓加載
默認情況下Ribbon是懶加載的。當服務啟動好之后,第一次請求是非常慢的,第二次之后就快很多。
解決方式:開啟飢餓加載
ribbon:
eager-load:
enabled: true #開啟飢餓加載
clients: server-1,server-2,server-3 #為哪些服務的名稱開啟飢餓加載,多個用逗號分隔
Ribbon負載均衡的八種算法,其中ResponseTimeWeightedRule
已廢除
ResponseTimeWeightedRule
規則名稱 | 特點 |
---|---|
AvailabilityFilteringRule |
過濾掉一直連接失敗的被標記為circuit tripped(電路跳閘)的后端Service,並過濾掉那些高並發的后端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所Zone的性能和Server的可用性選擇Server,在沒有Zone的環境下,類似於輪詢(RoundRobinRule ) |
java文件配置Ribbon負載均衡規則:
package com.springcloud.demo.client.config; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.RandomRule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @Author: yzp * @Date: 2020-6-5 9:33 * @description */ @Configuration public class RibbonConfig { /** * @return 負載均衡規則 */ @Bean public IRule iRule() { return new RandomRule(); } }
配置文件配置Ribbon負載均衡規則:
# 服務名稱 Service-ID demo-user: ribbon: # 屬性配置方式【推薦】配置文件配置負載均衡算法-這里使用的是自定義的Ribbon的負載均衡算法,默認 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
配置屬性方式
<clientName>:
ribbon:
NFLoadBalancerClassName: #ILoadBalancer該接口實現類
NFLoadBalancerRuleClassName: #IRule該接口實現類
NFLoadBalancerPingClassName: #Iping該接口實現類
NIWSServerListClassName: #ServerList該接口實現類
NIWSServerListFilterClassName: #ServiceListFilter該接口實現類
在這些屬性中定義的類優先於使用@RibbonClient(configuration=RibbonConfig.class)
Spring 定義的bean 以及由Spring Cloud Netflix提供的默認值。描述:配置文件中定義ribbon優先代碼定義
配置方式 | 優點 | 缺點 |
---|---|---|
代碼配置 | 基於代碼,更加靈活 | 有坑(父子上下文) 線上修改得重新打包,發布 |
屬性配置 | 易上手 配置更加直觀 線上修改無需重新打包,發布 優先級更高 |
極端場景下沒有配置配置方式靈活 |
實現負載均衡<全局>配置-隨機
方式一:Ribbon的配置類定義在主類下
讓ComponentScan上下文重疊(強烈不建議使用)
方式二:
@Configuration @RibbonClients(defaultConfiguration = RibbonConfig.class)//Ribbon負載均衡全局粒度配置(所有服務都按照這個配置) public class RibbonConfig { }
Ribbon核心功能之IPing
1、IPing是Ribbon保證服務可用的基石
2、IPing常見實現:NIWSDiscoveryPing、PingUrl
IPing算法 | 算法描述 |
---|---|
NIWSDiscoveryPing | 不執行Ping操作,根據Eureka Clien反饋判斷存活 |
PingUrl | 使用HttpClient操作對服務進行Ping操作 |
DummyPing | “人性本善”流算法,默認返回true |
NoOpPing | 永遠返回true |
Ribbon參數配置:
# Max number of retries on the same server (excluding the first try) ribbon.MaxAutoRetries=1 # Max number of next servers to retry (excluding the first server) ribbon.MaxAutoRetriesNextServer=1 # Whether all operations can be retried for this client ribbon.OkToRetryOnAllOperations=true # Interval to refresh the server list from the source ribbon.ServerListRefreshInterval=2000 # Connect timeout used by Apache HttpClient ribbon.ConnectTimeout=3000 # Read timeout used by Apache HttpClient ribbon.ReadTimeout=3000 # Initial list of servers, can be changed via Archaius dynamic property at runtime ribbon.listOfServers=www.baidu.com:80,www.jd.com:80
Ribbon參數可用在DefaultClientConfigImpl、CommonClientConfigKey文件查看。