默認狀況下Ribbon是懶加載的。當服務起動好以後,第一次請求是很是慢的,第二次以後就快不少。web
ribbon: eager-load: enabled: true #開啓飢餓加載 clients: server-1,server-2,server-3 #爲哪些服務的名稱開啓飢餓加載,多個用逗號分隔
接口 |
做用 |
默認值 |
---|---|---|
IclientConfig |
讀取配置 |
DefaultClientConfigImpl |
IRule |
負載均衡規則,選擇實例 |
ZoneAvoidanceRule |
IPing |
篩選掉ping不通的實例 |
DumyPing (該類什麼不幹,認爲每一個實例均可用,都能ping通) |
ServerList
|
交給Ribbon的實例列表 |
Ribbon:ConfigurationBasedServerList Spring Cloud Alibaba: NacosServerList |
ServerListFilter
|
過濾掉不符合條件的實例 |
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優先代碼定義併發
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 ) |
首先定義RestTemplate,而且添加註解@LoadBalanced
,這樣RestTemplate就實現了負載均衡app
@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/52097943dom
@Configuration public class GoodsRibbonRuleConfig { @Bean public IRule ribbonRulr() { return new RandomRule(); } }
或者使用自定義註解排除該類svg
server-1: # 服務名稱 Service-ID ribbon: # 屬性配置方式【推薦】 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 配置文件配置負載均衡算法-我這裏使用的是自定義的Ribbon的負載均衡算法,默認
優先級:配置(不會影響其餘服務)>(大於) 硬編碼(類得寫在SpringBoot啓動類包外,否則會影響其餘服務)wordpress
配置方式 |
有點 |
缺點 |
---|---|---|
代碼配置 |
基於代碼,更加靈活 |
有坑(父子上下文) 線上修改得從新打包,發佈 |
屬性配置 |
易上手 配置更加直觀 線上修改無需從新打包,發佈 優先級更高 |
極端場景下沒有配置配置方式靈活 |
讓ComponentScan上下文重疊(強烈不建議使用)高併發
@Configuration @RibbonClients(defaultConfiguration = GoodsRibbonRuleConfig.class)//Ribbon負載均衡全局粒度配置(全部服務都按照這個配置) public class RibbonConfig { }