您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“SpringCloud Ribbon組成和負載均衡的原理介紹”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
默認情況下Ribbon是懶加載的。當服務起動好之后,第一次請求是非常慢的,第二次之后就快很多。
ribbon: eager-load: enabled: true #開啟饑餓加載 clients: server-1,server-2,server-3 #為哪些服務的名稱開啟饑餓加載,多個用逗號分隔
接口 | 作用 | 默認值 |
---|---|---|
IclientConfig | 讀取配置 | DefaultClientConfigImpl |
IRule | 負載均衡規(guī)則,選擇實例 | ZoneAvoidanceRule |
IPing | 篩選掉ping不通的實例 | DumyPing (該類什么不干,認為每個實例都可用,都能ping通) |
ServerList<Server> | 交給Ribbon的實例列表 | Ribbon:ConfigurationBasedServerList <br>Spring Cloud Alibaba:NacosServerList |
ServerListFilter<Server> | 過濾掉不符合條件的實例 | ZonePreferenceServerListFilter |
ILoadBalancer | Ribbon的入口 | ZoneAwareLoadBalancer |
ServerListUpdater | 更新交給Ribbon的List的策略 | PollingServerListUpdater |
這里的每一項都可以自定義 IclientConfig
Ribbon支持非常靈活的配置就是由該組件提供的 IRule
為Ribbon提供規(guī)則,從而選擇實例、該組件是最核心的組件 舉例: 代碼方式
@Configuration public class RibbonRuleConfig { @Bean public IRule ribbonRulr() { return new RandomRule(); } @Bean public IPing iPing(){ return new PingUrl(); } }
配置屬性方式
<clientName>: ribbon: NFLoadBalancerClassName: #ILoadBalancer該接口實現(xiàn)類 NFLoadBalancerRuleClassName: #IRule該接口實現(xiàn)類 NFLoadBalancerPingClassName: #Iping該接口實現(xiàn)類 NIWSServerListClassName: #ServerList該接口實現(xiàn)類 NIWSServerListFilterClassName: #ServiceListFilter該接口實現(xiàn)類
在這些屬性中定義的類優(yōu)先于使用@RibbonClient(configuration=RibbonConfig.class)
Spring 定義的bean 以及由Spring Cloud Netflix提供的默認值。描述:配置文件中定義ribbon優(yōu)先代碼定義
ResponseTimeWeightedRule
~~已廢除規(guī)則名稱 | 特點 |
---|---|
AvailabilityFilteringRule | 過濾掉一直連接失敗的被標記為circuit tripped(電路跳閘)的后端Service,并過濾掉那些高并發(fā)的后端Server或者使用一個AvailabilityPredicate來包含過濾Server的邏輯,其實就是檢查status的記錄的各個Server的運行狀態(tài) |
BestAvailableRule | 選擇一個最小的并發(fā)請求的Server,逐個考察Server,如果Server被tripped了,則跳過 |
RandomRule | 隨機選擇一個Server |
ResponseTimeWeightedRule | 已廢棄,作用同WeightedResponseTimeRule |
RetryRule | 對選定的負責均衡策略機上充值機制,在一個配置時間段內(nèi)當選擇Server不成功,則一直嘗試使用subRule的方式選擇一個可用的Server |
RoundRobinRule | 輪詢選擇,輪詢index,選擇index對應位置Server |
WeightedResponseTimeRule | 根據(jù)相應時間加權(quán),相應時間越長,權(quán)重越小,被選中的可能性越低 |
ZoneAvoidanceRule | (默認是這個)負責判斷Server所Zone的性能和Server的可用性選擇Server,在沒有Zone的環(huán)境下,類似于輪詢(RoundRobinRule ) |
首先定義RestTemplate,并且添加注解@LoadBalanced
,這樣RestTemplate就實現(xiàn)了負載均衡
@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: 指向負載均衡規(guī)則的配置類 public class GoodsRibbonConfig { }
添加Ribbon的配置類,注意該類必須配置在@SpringBootApplication
主類以外的包下。不然的話所有的服務都會按照這個規(guī)則來實現(xiàn)。會被所有的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的負載均衡算法,默認
優(yōu)先級:配置(不會影響其他服務)>(大于) 硬編碼(類得寫在SpringBoot啟動類包外,不然會影響其他服務)
配置方式 | 有點 | 缺點 |
---|---|---|
代碼配置 | 基于代碼,更加靈活 | 有坑(父子上下文)<br> 線上修改得重新打包,發(fā)布 |
屬性配置 | 易上手 配置更加直觀 <br> 線上修改無需重新打包,發(fā)布 <br> 優(yōu)先級更高 | 極端場景下沒有配置配置方式靈活 |
讓ComponentScan上下文重疊(強烈不建議使用)
@Configuration @RibbonClients(defaultConfiguration = GoodsRibbonRuleConfig.class)//Ribbon負載均衡全局粒度配置(所有服務都按照這個配置) public class RibbonConfig { }
“SpringCloud Ribbon組成和負載均衡的原理介紹”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。