1.Ribbon負(fù)載均衡流程
假設(shè)我們有一臺 order-service 訂單服務(wù),兩臺 user-service 用戶服務(wù),當(dāng)訂單服務(wù)需要調(diào)用用戶服務(wù)獲取用戶信息的時候,應(yīng)該怎么分配調(diào)用哪臺服務(wù)呢?
這時候就需要用到 Ribbon
組件了。
首先,我們發(fā)起遠(yuǎn)程調(diào)用的時候,指定的是需要調(diào)用的服務(wù)名稱,然后我們會調(diào)用 Ribbon
組件,Ribbon 會從注冊中心中拉取 user-service 服務(wù)的信息,其中就包括這兩臺 user-service 服務(wù)的所在地址,這時候 order-service 就獲取到 user-service 服務(wù)所在的兩個地址了。
那么這兩個地址我們怎么選擇其中一個地址進(jìn)行調(diào)用呢?這時候就由 Ribbon 決定到底選擇哪一臺服務(wù)器進(jìn)行調(diào)用,它選用的策略是輪詢
。比如:找到的第一個服務(wù)器是8081,那么 order-service 最終進(jìn)行調(diào)用的就是 8081 的 user-service 服務(wù)。
當(dāng)然,輪詢只是 Ribbon 中的其中一種負(fù)載均衡策略,那么其他還有哪些負(fù)載均衡策略呢?
2.Ribbon負(fù)載均衡策略
Ribbon 中一共封裝了 7 種負(fù)載均衡策略,
1)RoundRobinRule
:簡單輪詢服務(wù)列表來選擇服務(wù)器。
就是按照一定的順序去調(diào)用服務(wù)的實例。比如我們剛才有 8081 和 8082 的兩個 user-service 實例,假如第一次調(diào)用 8081,那么第二次就會調(diào)用 8082 了,以此類推。
2)WeightedResponseTimeRule
:按照權(quán)重來選擇服務(wù)器,響應(yīng)時間越長,權(quán)重越小。
其中的 ResponseTime 就是指響應(yīng)時間,意思是說響應(yīng)時間越長,權(quán)重就越小,被選擇的概率就越低。
3)RandomRule
:隨機選擇一個可用的服務(wù)器。
這個比較簡單,就是單純的隨機。
4)BestAvailableRule
:忽略那些短路的服務(wù)器,并選擇并發(fā)數(shù)較低的服務(wù)器。
最小連接數(shù)策略。舉個例子,比如我們還是有兩臺服務(wù)器,第一臺的連接數(shù)是100,第二臺是50,那這時候就會選擇50的連接數(shù)對應(yīng)的服務(wù)器進(jìn)行連接,這就是指并發(fā)數(shù)較低的服務(wù)器,也可以理解成是選擇一個空閑比較多的服務(wù)器進(jìn)行連接。
5)RetryRule
:重試機制的選擇邏輯。
首先,還是會按照輪詢的方式選擇服務(wù),然后進(jìn)行遠(yuǎn)程調(diào)用。但是,假如某些服務(wù)實例為null,或者某些服務(wù)實例已經(jīng)宕機失效了,它就會按照指定的時間進(jìn)行不斷地重試,來去獲取這個服務(wù),這個就是重試機制的選擇邏輯。
6)AvailabilityFilteringRule
:可用性敏感策略,先過濾非健康的,再選擇連接數(shù)較小的實例。
比如說我們有三臺服務(wù)器,如果第一臺服務(wù)器已經(jīng)宕機了,很顯然就不選擇第一臺服務(wù)器了,然后再從第二、三臺服務(wù)器中選擇連接數(shù)比較小的實例,比如第二臺服務(wù)器的連接數(shù)是100,第三臺服務(wù)器的連接數(shù)是50,那么很顯然就要去選擇第三臺服務(wù)器。
7)ZoneAvoidanceRule
:默認(rèn)策略,以區(qū)域可用的服務(wù)器為基礎(chǔ)進(jìn)行服務(wù)器的選擇。使用 Zone 對服務(wù)器進(jìn)行分類,這個 Zone 可以理解為一個機房、一個機架等。而后再對 Zone 內(nèi)的多個服務(wù)做輪詢。
意思是說,服務(wù)很多的時候,就會存在很多機房,比如一個在上海,一個在北京。假如服務(wù)的調(diào)用方也在北京,那么就會優(yōu)先選擇北京的機房服務(wù)器進(jìn)行連接,就近原則。一般情況下,比如說我們沒有區(qū)域的概念,那么這時候還是會根據(jù)輪詢的方式來完成調(diào)用。
以上就是 Ribbon 最常見的七種負(fù)載均衡策略,標(biāo)紅的是面試的時候最好能給面試官陳述出來的部分。
3.自定義負(fù)載均衡策略如何實現(xiàn)
我們可以自己創(chuàng)建類實現(xiàn) IRule
接口,然后再通過配置類或配置文件配置即可,通過定義 IRule 實現(xiàn)可以修改負(fù)載均衡規(guī)則,有兩種方式。
假如我們有一個 order-service 訂單服務(wù)調(diào)用 user-service 用戶服務(wù),用戶服務(wù)有 8081 和 8082 兩個節(jié)點。
現(xiàn)在我們想實現(xiàn)自定義的負(fù)載均衡策略,我們都是在服務(wù)的發(fā)起方 order-service 進(jìn)行配置的。
第一種方法: 我們可以加一個配置類,在配置類中設(shè)置一個返回值 IRule
,我們可以直接將七種負(fù)載均衡策略中的其中一種進(jìn)行返回。
第二種方式: 我們可以在 yaml
文件中進(jìn)行配置。
user-service:
ribbon:
NFLoadBalanceRuleClassName: com.netflix.loadbalancer.RandomRule # 負(fù)載均衡規(guī)則
這兩種配置方式有什么不同?
-
第一種通過配置類自定義注入 Bean 的方式,是全局生效的。
意思是只要是 order-service 服務(wù)采用 Ribbon 進(jìn)行的負(fù)載均衡調(diào)用都是使用的自定義負(fù)載均衡策略。
-
第二種通過 yaml 配置的方式,是局部生效的。
意思是在 order-service 服務(wù)采用 Ribbon 進(jìn)行負(fù)載均衡的時候,只有請求 user-service 服務(wù)的請求是使用的自定義負(fù)載均衡策略。
4.總結(jié)
1)項目負(fù)載均衡如何實現(xiàn)?
微服務(wù)的負(fù)載均衡主要使用了一個組件 Ribbon
,比如,我們在使用 feign 遠(yuǎn)程調(diào)用的過程中,底層的負(fù)載均衡就是使用了 Ribbon。
2)Ribbon負(fù)載均衡有哪些?
-
RoundRobinRule
:簡單輪詢服務(wù)列表來選擇服務(wù)器。 -
WeightedResponseTimeRule
:按照權(quán)重來選擇服務(wù)器,響應(yīng)時間越長,權(quán)重越小。 -
RandomRule
:隨機選擇一個可用的服務(wù)器。 -
ZoneAvoidanceRule
:默認(rèn),區(qū)域敏感策略,以區(qū)域可用的服務(wù)器為基礎(chǔ)進(jìn)行服務(wù)器的選擇。使用 Zone 對服務(wù)器進(jìn)行分類,這個 Zone 可以理解為一個機房、一個機架等。而后再對 Zone 內(nèi)的多個服務(wù)做輪詢。
3)自定義負(fù)載均衡策略如何實現(xiàn)?
提供了兩種方式:
① 創(chuàng)建類實現(xiàn) IRule
接口,可以指定負(fù)載均衡策略(全局生效)。
② 在客戶端的 yaml
配置文件中,可以配置某一個服務(wù)調(diào)用的負(fù)載均衡策略(局部生效)。
5.思考
1)如果通過 feign 調(diào)用本服務(wù),會負(fù)載均衡嗎?
答案:會。因為即使調(diào)用本服務(wù),也會先從注冊中心獲取服務(wù)所有節(jié)點的地址信息去負(fù)載均衡。
比如,我們寫一個下面這樣的 Controller 來動態(tài)打印當(dāng)前服務(wù)的端口:
@RestController
@RequestMapping("/demo")
public class DemoController {
@Value("${server.port:}")
private String port;
@Autowired
private DemoFeignClient demoFeignClient;
@GetMapping("/test")
public Result<Object> test() {
String data = "This is a test! port:" + port;
return Result.succeed().setData(data);
}
@GetMapping("/feignTest")
public Result<Object> feignTest() {
return demoFeignClient.test();
}
}
我們再寫一個 feign client 類來調(diào)用本服務(wù)的接口:
@FeignClient(value = "springboot-feign")
public interface DemoFeignClient {
@GetMapping("/demo/test")
Result<Object> test();
}
當(dāng)我們用 8081 和 8082 端口來啟動兩個實例后,調(diào)用接口:http://localhost:8081/demo/feignTest,可以發(fā)現(xiàn)返回的端口實際上是輪詢打印的:
文章來源:http://www.zghlxwxcb.cn/news/detail-516263.html
整理完畢,完結(jié)撒花~ ??文章來源地址http://www.zghlxwxcb.cn/news/detail-516263.html
到了這里,關(guān)于SpringCloud(3) Ribbon負(fù)載均衡,負(fù)載均衡策略,自定義負(fù)載均衡的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!