Ribbon飢餓加載
默認情況下Ribbon是懶加載的。當服務起動好之後,第一次請求是非常慢的,第二次之後就快很多。
解決方式:開啟飢餓加載
ribbon:
eager-load:
enabled: true #開啟飢餓加載
clients: server-1,server-2,server-3 #為哪些服務的名稱開啟飢餓加載,多個用逗號分隔
Ribbon組成
接口 | 作用 | 默認值 |
---|---|---|
IclientConfig |
讀取配置 | DefaultClientConfigImpl |
IRule |
負載均衡規則,選擇實例 | ZoneAvoidanceRule |
IPing |
篩選掉ping不通的實例 |
DumyPing (該類什麼不幹,認為每個實例都可用,都能ping通) |
ServerList<Server> |
交給Ribbon的實例列表 |
Ribbon:ConfigurationBasedServerList Spring Cloud Alibaba: NacosServerList
|
ServerListFilter<Server> |
過濾掉不符合條件的實例 | ZonePreferenceServerListFilter |
ILoadBalancer |
Ribbon的入口 | ZoneAwareLoadBalancer |
ServerListUpdater |
更新交給Ribbon的List的策略 | PollingServerListUpdater |
這裡的每一項都可以自定義IclientConfig
Ribbon支持非常靈活的配置就是由該組件提供的IRule
為Ribbon提供規則,從而選擇實例、該組件是最核心的組件
舉例:
代碼方式
@Configuration
public class RibbonRuleConfig {
@Bean
public IRule ribbonRulr() {
return new RandomRule();
}
@Bean
public IPing iPing(){
return new PingUrl();
}
}
配置屬性方式
<clientName>:
ribbon:
NFLoadBalancerClassName: #ILoadBalancer該接口實現類
NFLoadBalancerRuleClassName: #IRule該接口實現類
NFLoadBalancerPingClassName: #Iping該接口實現類
NIWSServerListClassName: #ServerList該接口實現類
NIWSServerListFilterClassName: #ServiceListFilter該接口實現類
在這些屬性中定義的類優先於使用@RibbonClient(configuration=RibbonConfig.class)
Spring 定義的bean 以及由Spring Cloud Netflix提供的默認值。描述:配置文件中定義ribbon優先代碼定義
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代碼方式
首先定義RestTemplate,並且添加註解@LoadBalanced
,這樣RestTemplate就實現了負載均衡
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
//template.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));//解決中文亂碼
return new RestTemplate();
}
在SpringBootApplication主類下添加配置類。該類主要作用於為哪個服務做負載均衡。默認的是輪訓
@Configuration
@RibbonClient(name = "${服務名稱}", configuration = GoodsRibbonRuleConfig.class)//configuration: 指向負載均衡規則的配置類
public class GoodsRibbonConfig {
}
添加Ribbon的配置類,注意該類必須配置在@SpringBootApplication
主類以外的包下。不然的話所有的服務都會按照這個規則來實現。會被所有的RibbonClient共享。主要是主類的主上下文和Ribbon的子上下文起衝突了。父子上下文不能重疊。相關連接:https://blog.csdn.net/qq_32588349/article/details/52097943
@Configuration
public class GoodsRibbonRuleConfig {
@Bean
public IRule ribbonRulr() {
return new RandomRule();
}
}
或者使用自定義註解排除該類
方式一:配置屬性方式
server-1: # 服務名稱 Service-ID
ribbon:
# 屬性配置方式【推薦】
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 配置文件配置負載均衡算法-我這裡使用的是自定義的Ribbon的負載均衡算法,默認
優先級:配置(不會影響其他服務)>(大於) 硬編碼(類得寫在SpringBoot啟動類包外,不然會影響其他服務)
總結:
配置方式 | 有點 | 缺點 |
---|---|---|
代碼配置 | 基於代碼,更加靈活 | 有坑(父子上下文) 線上修改得重新打包,發佈 |
屬性配置 | 易上手 配置更加直觀 線上修改無需重新打包,發佈 優先級更高 |
極端場景下沒有配置配置方式靈活 |
實現負載均衡<全局>配置-隨機
方式一:Ribbon的配置類定義在主類下
讓ComponentScan上下文重疊(強烈不建議使用)
方式二:
@Configuration
@RibbonClients(defaultConfiguration = GoodsRibbonRuleConfig.class)//Ribbon負載均衡全局粒度配置(所有服務都按照這個配置)
public class RibbonConfig {
}