SpringBoot整合Ribbon源碼分析之Ribbon簡介和核心組件

2024年2月6日 20点热度 0人点赞

一、簡介

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簡單的執行流程圖:

Ribbon執行流程

流程先從ILoadBalancer執行開始,選擇服務實例過程如下

1.通過ServerList獲取當前可用的服務實例列表。

2.通過ServerListFilter將步驟1獲取的服務實例進行一次過濾返回滿足條件的服務實例列表。

3.通過IRule規則,結合服務實例的統計信息,返回滿足條件的某一個服務實例。

總結:

本篇主要簡單的介紹一下Ribbon的概念和核心組件的作用以及它們執行的執行流程,下一篇文章開始我將開始分析SpringBoot整合Ribbon的源碼,可以一步步看出這些核心組件是怎麼加載到容器中的,又是怎麼相互調用返回可用的服務實例列表,好了,我是愛編程的程序員老徐,如果喜歡我的文章請點贊,我們下期見。