SpringCloud中的Ribbon負(fù)載均衡器詳細(xì)解析
一、Ribbon的簡(jiǎn)介
1.1 簡(jiǎn)介
Spring Cloud Ribbon 是一個(gè)基于 HTTP 和 TCP 的客戶端負(fù)載均衡工具,它基于 Netflix Ribbon 實(shí)現(xiàn)。通過(guò) Spring Cloud 的封裝,可以讓我們輕松地將面向服務(wù)的 REST 模版請(qǐng)求自動(dòng)轉(zhuǎn)換成客戶端負(fù)載均衡的服務(wù)調(diào)用。
目前主流的負(fù)載方案分為以下兩種:
- 集中式負(fù)載均衡,在消費(fèi)者和服務(wù)提供方中間使用獨(dú)立的代理方式進(jìn)行負(fù)載,有硬件的(比如 F5),也有軟件的(比如 Nginx)。
- 客戶端自己做負(fù)載均衡,根據(jù)自己的請(qǐng)求情況做負(fù)載,Ribbon 就屬于客戶端自己做負(fù)載。
1.2 引言
Robbin是幫助我們實(shí)現(xiàn)服務(wù)與服務(wù)之間的負(fù)載均衡。
- 客戶端負(fù)載均衡:customer客戶端模塊,將2個(gè)Search模塊信息全部拉取到本地的緩存,在customer中自己做一個(gè)負(fù)載均衡的策略,選中某一個(gè)服務(wù)。
- 服務(wù)端負(fù)載均衡:在注冊(cè)中心中,直接根據(jù)你指定的負(fù)載均衡策略,幫你選中一個(gè)指定的服務(wù)器信息,并返回。
二、快速入門
2.1 啟動(dòng)兩個(gè)Search模塊
通過(guò) Run/Debug Configurations 啟動(dòng)兩個(gè) Search模塊。
2.2 導(dǎo)入Ribbon相關(guān)依賴
在 customer 中導(dǎo)入 Ribbon 相關(guān)依賴。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
2.3 整合 RestTemplate 和 Ribbon
在注入 RestTemplate 的方法上添加 @LoadBalanced 注解,即可整合 RestTemplate 和 Ribbon 。
//@LoadBalanced 將RestTemplate和Robbin整合 @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
2.4 訪問(wèn) Search
通過(guò)整合了 Ribbon 的 RestTemplate 去訪問(wèn)Search (原來(lái)的 ip:port 現(xiàn)在可以用服務(wù)名代替)。
@GetMapping("/customer") public String customer() { String result = restTemplate.getForObject("http://SEARCH/search", String.class); return result; }
三、Ribbon 的負(fù)載均衡
Ribbon 作為一款客戶端負(fù)載均衡框架,默認(rèn)的負(fù)載策略是輪詢,同時(shí)也提供了很多其他的策略,能夠讓用戶根據(jù)自身的業(yè)務(wù)需求進(jìn)行選擇。
3.1 Ribbon負(fù)載均衡簡(jiǎn)介
BestAvailabl
選擇一個(gè)最小的并發(fā)請(qǐng)求的 Server,逐個(gè)考察 Server,如果 Server 被標(biāo)記為錯(cuò)誤,則跳過(guò),然后再選擇 ActiveRequestCount 中最小的 Server。
AvailabilityFilteringRule
過(guò)濾掉那些一直連接失敗的且被標(biāo)記為 circuit tripped 的后端 Server,并過(guò)濾掉那些高并發(fā)的后端 Server 或者使用一個(gè) AvailabilityPredicate 來(lái)包含過(guò)濾 Server 的邏輯。其實(shí)就是檢查 Status 里記錄的各個(gè) Server 的運(yùn)行狀態(tài)。
ZoneAvoidanceRule
使用 ZoneAvoidancePredicate 和 AvailabilityPredicate 來(lái)判斷是否選擇某個(gè) Server,前一個(gè)判斷判定一個(gè) Zone 的運(yùn)行性能是否可用,剔除不可用的 Zone(的所有 Server),AvailabilityPredicate 用于過(guò)濾掉連接數(shù)過(guò)多的 Server。
RandomRule(隨機(jī)策略)
隨機(jī)選擇一個(gè) Server。
RoundRobinRule(輪詢策略)
輪詢選擇,輪詢 index,選擇 index 對(duì)應(yīng)位置的 Server。
RetryRule
對(duì)選定的負(fù)載均衡策略機(jī)上重試機(jī)制,也就是說(shuō)當(dāng)選定了某個(gè)策略進(jìn)行請(qǐng)求負(fù)載時(shí)在一個(gè)配置時(shí)間段內(nèi)若選擇 Server 不成功,則一直嘗試使用 subRule 的方式選擇一個(gè)可用的 Server。
ResponseTimeWeightedRule
作用同 WeightedResponseTimeRule,ResponseTime-Weighted Rule 后來(lái)改名為 WeightedResponseTimeRule。
WeightedResponseTimeRule
默認(rèn)會(huì)采用輪詢的策略,,根據(jù)響應(yīng)時(shí)間會(huì)自動(dòng)分配一個(gè) Weight(權(quán)重),響應(yīng)時(shí)間越長(zhǎng),Weight 越小,被選中的可能性越低。
3.2 Ribbon負(fù)載均衡的使用
3.2.1 采用注解的方式實(shí)現(xiàn)負(fù)載均衡
在 Ribbon Client 端注入策略的對(duì)象即可。
//配置robbinRule策略 @Bean public IRule robbinRule(){ return new RandomRule(); }
3.2.2 采用配置文件的方式實(shí)現(xiàn)負(fù)載均衡
#指定具體服務(wù)的負(fù)載均衡策略 SEARCH: #編寫服務(wù)名稱 ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule #具體負(fù)載均衡使用的類
到此這篇關(guān)于SpringCloud中的Ribbon負(fù)載均衡器詳細(xì)解析的文章就介紹到這了,更多相關(guān)Ribbon負(fù)載均衡器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Can''t use Subversion command line client:svn 報(bào)錯(cuò)處理
這篇文章主要介紹了Can't use Subversion command line client:svn 報(bào)錯(cuò)處理的相關(guān)資料,需要的朋友可以參考下2016-09-09Spring中@Async注解執(zhí)行異步任務(wù)的方法
在業(yè)務(wù)處理中,有些業(yè)務(wù)使用異步的方式更為合理,這篇文章主要介紹了Spring中@Async注解執(zhí)行異步任務(wù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06spring的data派生查詢機(jī)制的實(shí)現(xiàn)
SpringData的派生查詢是一種通過(guò)方法名約定自動(dòng)生成數(shù)據(jù)庫(kù)查詢的機(jī)制,無(wú)需手動(dòng)編寫SQL或JPQL,下面就來(lái)介紹一下spring data派生查詢的實(shí)現(xiàn),感興趣的可以了解一下2025-03-03Java類成員訪問(wèn)權(quán)限控制知識(shí)總結(jié)
這篇文章主要介紹了Java類成員訪問(wèn)權(quán)限控制知識(shí)總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Mybatis自關(guān)聯(lián)查詢一對(duì)多查詢的實(shí)現(xiàn)示例
這篇文章主要介紹了Mybatis自關(guān)聯(lián)查詢一對(duì)多查詢的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Springboot下使用Redis管道(pipeline)進(jìn)行批量操作
本文主要介紹了Spring?boot?下使用Redis管道(pipeline)進(jìn)行批量操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05SpringBoot基于Mybatis攔截器和JSqlParser實(shí)現(xiàn)數(shù)據(jù)隔離
本文將介紹如何在 Spring Boot 項(xiàng)目中利用Mybatis的強(qiáng)大攔截器機(jī)制結(jié)合JSqlParser,一個(gè)功能豐富的 SQL 解析器,來(lái)輕松實(shí)現(xiàn)數(shù)據(jù)隔離的目標(biāo),本文根據(jù)示例展示如何根據(jù)當(dāng)前的運(yùn)行環(huán)境來(lái)實(shí)現(xiàn)數(shù)據(jù)隔離,需要的朋友可以參考下2024-04-04Java實(shí)現(xiàn)IP地址到二進(jìn)制的轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)IP地址到二進(jìn)制的轉(zhuǎn)換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Java實(shí)現(xiàn)統(tǒng)計(jì)字符串出現(xiàn)的次數(shù)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)統(tǒng)計(jì)字符串出現(xiàn)的次數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10