一、簡介
Ribbon是Netflix出品的一套負載均衡組件,提供了許多Rule規則從負載均衡列表中選取合適的server實例。當實例出現問題時候,Ribbon本身具有自動移除問題實例的功能。
二、核心組件介紹
1.ILoadBalancer
它是定義負載均衡選擇服務的核心方法的接口,它的默認實現類是ZoneAwareLoadBalancer,它的核心方法如下:
package com.netflix.loadbalancer;
import java.util.List;
public interface ILoadBalancer {
public void addServers(List<Server> newServers);
//選擇一個服務
public Server chooseServer(Object key);
public void markServerDown(Server server);
@Deprecated
public List<Server> getServerList(boolean availableOnly);
public List<Server> getReachableServers();
//獲取所有服務列表
public List<Server> getAllServers();
}
2.IRule
定義Ribbon中負載均衡策略的接口,它的默認實現類是ZoneAvoidanceRule,它是基於ZoneAvoidancePredicate計算出哪個Zone的服務最差,然後從服務列表剔除,AvailabilityPredicate是過濾掉正在處於熔斷狀態的服務,上述兩個斷言過濾出來的服務再通過輪詢方式從服務獲取一個。
除了這個類,還有一個實現類是RandomRule它是一個隨機的負載均衡策略的實現,即從多個服務器中隨機獲取一個服務實例。
另一個實現類是RoundRobinRule,它是輪詢的機制,每個服務實例都同等被調用,在選擇過程中最多有10次的重試機制。
3.IClientConfig
定義Ribbon中管理管理配置的接口,例如指定Ribbon客戶端的連接超時時間、讀取超時時間等等,默認實現類是DefaultClientConfigImpl。
4.IPing
檢查服務是否可用的方法,常見的是通過HTTP、TCP方式。
5.ServerList
維護著一組Server實例列表,在應該程序運行過程中,Ribbon通過ServerList中的服務實例供負載均衡選擇,ServerList維護的實例列表可能在運行過程中發生動態變化。
ServerList提供了兩個重要方法,代碼如下:
package com.netflix.loadbalancer;
import java.util.List;
public interface ServerList<T extends Server> {
//第一次獲取的Server列表
public List<T> getInitialListOfServers();
//更新Server列表
public List<T> getUpdatedListOfServers();
}
6.ServerListUpdater
ServerListUpdater有多個方法,其中有個start方法開啟定時任務調用UpdateAction來更新服務實例列表,它的實現類是PollingServerListUpdater,此對象會啟動一個定時線程池定時執行更新策略,當服務有新的實例添加進來會動態更新。
三、工作流程
下面是一張Ribbon簡單的執行流程圖:
![](https://news.xinpengboligang.com/upload/keji/e5907797d3ad5df8703d1ed0f278b56a.jpeg)
Ribbon執行流程
流程先從ILoadBalancer執行開始,選擇服務實例過程如下
1.通過ServerList獲取當前可用的服務實例列表。
2.通過ServerListFilter將步驟1獲取的服務實例進行一次過濾返回滿足條件的服務實例列表。
3.通過IRule規則,結合服務實例的統計信息,返回滿足條件的某一個服務實例。
總結:
本篇主要簡單的介紹一下Ribbon的概念和核心組件的作用以及它們執行的執行流程,下一篇文章開始我將開始分析SpringBoot整合Ribbon的源碼,可以一步步看出這些核心組件是怎麼加載到容器中的,又是怎麼相互調用返回可用的服務實例列表,好了,我是愛編程的程序員老徐,如果喜歡我的文章請點贊,我們下期見。