溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringCloud Ribbon組成和負載均衡的原理介紹

發(fā)布時間:2021-06-25 18:01:18 來源:億速云 閱讀:350 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“SpringCloud Ribbon組成和負載均衡的原理介紹”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

Ribbon饑餓加載

默認情況下Ribbon是懶加載的。當服務起動好之后,第一次請求是非常慢的,第二次之后就快很多。

解決方式:開啟饑餓加載
ribbon:
 eager-load:
  enabled: true #開啟饑餓加載
  clients: server-1,server-2,server-3 #為哪些服務的名稱開啟饑餓加載,多個用逗號分隔

Ribbon組成

接口作用默認值
IclientConfig讀取配置DefaultClientConfigImpl
IRule負載均衡規(guī)則,選擇實例ZoneAvoidanceRule
IPing篩選掉ping不通的實例DumyPing(該類什么不干,認為每個實例都可用,都能ping通)
ServerList<Server>交給Ribbon的實例列表Ribbon:ConfigurationBasedServerList<br>Spring Cloud Alibaba:NacosServerList
ServerListFilter<Server>過濾掉不符合條件的實例ZonePreferenceServerListFilter
ILoadBalancerRibbon的入口ZoneAwareLoadBalancer
ServerListUpdater更新交給Ribbon的List的策略PollingServerListUpdater

這里的每一項都可以自定義 IclientConfigRibbon支持非常靈活的配置就是由該組件提供的 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)先代碼定義

Ribbon負載均衡的八種算法,其中~~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

實現(xiàn)負載均衡<細粒度>配置-隨機

方式一:JAVA代碼方式

首先定義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啟動類包外,不然會影響其他服務)

總結(jié):
配置方式有點缺點
代碼配置基于代碼,更加靈活有坑(父子上下文)<br> 線上修改得重新打包,發(fā)布
屬性配置易上手 配置更加直觀 <br> 線上修改無需重新打包,發(fā)布 <br> 優(yōu)先級更高極端場景下沒有配置配置方式靈活

實現(xiàn)負載均衡<全局>配置-隨機

方式一:Ribbon的配置類定義在主類下

讓ComponentScan上下文重疊(強烈不建議使用

方式二:
@Configuration
@RibbonClients(defaultConfiguration = GoodsRibbonRuleConfig.class)//Ribbon負載均衡全局粒度配置(所有服務都按照這個配置)
public class RibbonConfig {
}

“SpringCloud Ribbon組成和負載均衡的原理介紹”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI