Spring Cloud Ribbon是一個基於HTTP和TCP的客戶端負載均衡工具,它基於Netflix Ribbon實現,經過Spring Cloud Ribbon的封裝,在微服務架構中使用客戶端負載均衡調用很是簡單。Ribbon是Spring Cloud整個你們庭中相對而言比較複雜的模塊,直接影響到服務調度的質量和性能。java
負載均衡是對系統的高可用、網絡壓力的緩解和處理能力擴容的重要手段之一。負載均衡分爲:算法
(1)服務端負載均衡:維護一個可用的服務端清單,經過心跳檢測來剔除故障的服務端節點,保證清單中都是可正常訪問的服務端節點。當客戶端發送請求到負載均衡設備的時候,該設備按某種算法(輪詢、加權等)從維護的可用服務端清單中取出一臺服務端端地址,而後進行轉發。服務器
(2)客戶端負載均衡:和服務端負載均衡最大的不一樣點在於服務清單所存儲的位置。在客戶端負載均衡中,全部客戶端節點都維護着本身要訪問的服務端清單,而這些服務端端清單來自於服務註冊中心。網絡
在和Feign結合的場景下,最終請求會轉發成 http://<服務名稱>/<relative-path-to-service>的格式,經過LoadBalancerFeignClient,
提取出服務標識<服務名稱>,而後根據服務名稱在上下文中查找對應服務的負載均衡器FeignLoadBalancer。負載均衡器負責根據既有的服務實例的統計信息,挑選出最合適的服務實例。架構
(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的實現類有:框架
(3)IPing用來檢測Server是否可用,ILoadBalancer的實現類維護一個Timer每隔10s(this.pingIntervalSeconds = 10)檢測一次Server的可用狀態dom
public interface IPing { boolean isAlive(Server var1); }