微服務-Ribbon

    Spring Cloud Ribbon是一個基於HTTP和TCP的客戶端負載均衡工具,它基於Netflix Ribbon實現,經過Spring Cloud Ribbon的封裝,在微服務架構中使用客戶端負載均衡調用很是簡單。Ribbon是Spring Cloud整個你們庭中相對而言比較複雜的模塊,直接影響到服務調度的質量和性能。java

1、客戶端負載均衡

負載均衡是對系統的高可用、網絡壓力的緩解和處理能力擴容的重要手段之一。負載均衡分爲:算法

  • 服務端負載均衡,又分爲硬件負載均衡(好比F5)、軟件負載均衡(好比Nginx)
  • 客戶端負載均衡(好比Ribbon)

(1)服務端負載均衡:維護一個可用的服務端清單,經過心跳檢測來剔除故障的服務端節點,保證清單中都是可正常訪問的服務端節點。當客戶端發送請求到負載均衡設備的時候,該設備按某種算法(輪詢、加權等)從維護的可用服務端清單中取出一臺服務端端地址,而後進行轉發。服務器

(2)客戶端負載均衡:和服務端負載均衡最大的不一樣點在於服務清單所存儲的位置。在客戶端負載均衡中,全部客戶端節點都維護着本身要訪問的服務端清單,而這些服務端端清單來自於服務註冊中心。網絡

2、和feign的集成實現方式

在和Feign結合的場景下,最終請求會轉發成 http://&lt;服務名稱>/<relative-path-to-service>的格式,經過LoadBalancerFeignClient,
提取出服務標識<服務名稱>,而後根據服務名稱在上下文中查找對應服務的負載均衡器FeignLoadBalancer。負載均衡器負責根據既有的服務實例的統計信息,挑選出最合適的服務實例。架構

3、原理

(1)Ribbon經過ILoadBalancer接口對外提供統一的選擇服務器(Server)的功能,此接口會根據不一樣的負載均衡策略(IRule)選擇合適的Server返回給使用者。併發

public interface ILoadBalancer {
    void addServers(List<Server> var1);

    Server chooseServer(Object var1);

    void markServerDown(Server var1);

    /** @deprecated */
    @Deprecated
    List<Server> getServerList(boolean var1);

    List<Server> getReachableServers();

    List<Server> getAllServers();
}

(2)IRule是負載均衡策略的抽象,ILoadBalancer經過調用IRule的choose()方法返回Server,其核心方法以下:負載均衡

public interface IRule {
    Server choose(Object var1);

    void setLoadBalancer(ILoadBalancer var1);

    ILoadBalancer getLoadBalancer();
}

IRule的實現類有:框架

  • BestAvailableRule 跳過熔斷的Server,在剩下的Server中選擇併發請求最低的Server
  • ClientConfigEnabledRoundRobinRule 輪詢
  • RoundRobinRule 輪詢
  • RandomRule 隨機選擇
  • RetryRule 可重試的策略,能夠對其餘策略進行重試,默認輪詢重試
  • WeightedResponseTimeRule 根據響應時間加權,響應時間越短權重越大
  • AvailabilityFilteringRule 剔除由於連續連接、讀失敗或連接超過最大限制致使熔斷的Server,在剩下讀Server中進行輪詢

(3)IPing用來檢測Server是否可用,ILoadBalancer的實現類維護一個Timer每隔10s(this.pingIntervalSeconds = 10)檢測一次Server的可用狀態dom

public interface IPing {
    boolean isAlive(Server var1);
}

4、總結

  • Ribbon是Spring Cloud框架中比較核心的模塊,負責着服務負載調用,Ribbon能夠脫離SpringCloud單獨使用。
  • Ribbon是客戶端的負載均衡框架,每一個客戶端上,獨立維護着自身的調用信息統計,相互隔離,Ribbon的負載均衡表如今各個機器上變現並不徹底一致
  • Ribbon是整個組件框架中最複雜的一環,控制流程上爲了保證服務的高可用性,有不少比較細節的參數控制
相關文章
相關標籤/搜索