天天看點

SpringBoot+SpringCloud成長之旅5-負載均衡器(Ribbon)Ribbon

本來想接下去寫SpringCloud裡我們常用的服務之間通信方式Feign的,但是在前面,我們講到了當在B服務調用A服務時,同時A服務又有多個的情況下,我們是通過@LoadBalanced或者LoadBalancerClient來實作用過應用名,就可以達到我們的需求。這裡其實可以了解下為什麼加上這個注解,就可以通路到我們想要的方法了。

Ribbon

Ribbon是一個負載均衡器,他是怎麼工作的呢。他的核心有三點:1.服務發現,2.服務選擇,3.服務監聽。根據名字就能很好的了解他的作用,服務發現就是發現所有服務,服務選擇就是通過某種規則選擇其中一個服務,服務監聽則是監聽所有服務做到及時剔除失效服務。他的主要元件也有三個,分别是ServerList,ServerListFilter,IRule。其中ServerList是用來擷取所有的可用服務清單的,然後會通過ServerListFilter過濾掉一部分的服務,然後通過IRule擷取其中一個服務。

當然了,我們可以通過LoadBalancerClient的源碼去看下這幾個元件的實作方式。

SpringBoot+SpringCloud成長之旅5-負載均衡器(Ribbon)Ribbon

我們之前寫的這一段代碼,就是根據服務名,去擷取服務的資訊了。是以我們追蹤下choose這個方法的源碼。

1.

SpringBoot+SpringCloud成長之旅5-負載均衡器(Ribbon)Ribbon

2.

SpringBoot+SpringCloud成長之旅5-負載均衡器(Ribbon)Ribbon

3.這裡,我們看下ILoadBalancer裡有些什麼

SpringBoot+SpringCloud成長之旅5-負載均衡器(Ribbon)Ribbon

4.ILoadBalancer這個接口裡有很方法,其中有兩個是擷取ServerList的,其中一個已經廢棄了,我們看另外一個getAllServers()

SpringBoot+SpringCloud成長之旅5-負載均衡器(Ribbon)Ribbon

5.在這裡就可以擷取所有的服務清單了。打斷點進行調試,就可看下。

SpringBoot+SpringCloud成長之旅5-負載均衡器(Ribbon)Ribbon

當我們擷取到服務清單之後,就是要從這些清單中擷取某個服務了,這時候Ribbon就會根據他的服務發現政策去擷取服務了,至于政策是怎麼樣的呢,讓我們來看下。

1.很明顯,這個chooseServer就是選擇服務的方法了。

SpringBoot+SpringCloud成長之旅5-負載均衡器(Ribbon)Ribbon

2.我們這裡隻需要關心他的選擇規則rule.choose就好了

SpringBoot+SpringCloud成長之旅5-負載均衡器(Ribbon)Ribbon

3.我們可以看見,IRule 初始定義了個new RoundRobinRule(),很明顯就是輪詢的機制了。

SpringBoot+SpringCloud成長之旅5-負載均衡器(Ribbon)Ribbon

4.了解了上面的東西之後,我們肯定會有疑問,改怎麼修改他的規則呢。這裡其實也很簡單,我們去spring官網去查找

SpringBoot+SpringCloud成長之旅5-負載均衡器(Ribbon)Ribbon

進入這個頁面,然後選擇Spring Cloud Netflix 并選擇對應版本的文檔。并搜尋ribbon選擇自定義ribbon用戶端。

SpringBoot+SpringCloud成長之旅5-負載均衡器(Ribbon)Ribbon

下拉找到我們需要的配置方法。

SpringBoot+SpringCloud成長之旅5-負載均衡器(Ribbon)Ribbon

把這段話複制到我們的配置檔案,然後我們需要去找其他規則,在哪呢,我們搜尋IRule就能找到:

SpringBoot+SpringCloud成長之旅5-負載均衡器(Ribbon)Ribbon

這些就是其他規則了,我們挑一個,通過翻譯,我們大概能知道,這個規則呢,他會自動去選擇并發量最少的服務,這是不是很nice。

SpringBoot+SpringCloud成長之旅5-負載均衡器(Ribbon)Ribbon

配置完的配置檔案如下

SpringBoot+SpringCloud成長之旅5-負載均衡器(Ribbon)Ribbon

ok,這樣就完成了我們需要的政策修改。當然,到這裡,又有人會想到,我們能不能自定義呢,我非要先請求A1服務兩次,再請求A2服務三次,當時也是ok的啦。不過我就不去了解了,等用到了再說把。哈哈