0、Ribbon基本認識
-
Spring Cloud Ribbon 是基于 Netflix Ribbon 實現的一套客戶端 負載均衡的工具。
-
Ribbon 主要功能是提供客戶端負載均衡算法和服務調用
-
Ribbon 客戶端組件提供一系列完善的配置項如連接超時,重試等。
-
Ribbon 會基于某種規則(如簡單輪詢,隨機連接等)去連接指定服務
-
程序員很容易使用 Ribbon 的負載均衡算法實現負載均衡
-
一句話: Ribbon: 負載均衡+RestTemplate 調用
官網地址: https://github.com/Netflix/ribbon
Ribbon 目前進入維護模式, 未來替換方案 是 Spring Cloud LoadBalancer
?1、LB(Load Balance)
- 集中式 LB
- 即在服務的消費方和提供方之間使用獨立的LB設施(可以是硬件,如F5,也可以是軟件,如Nginx),由該設施負責把訪問請求通過某種策略轉發至服務的提供方;
- LB(Load Balance 負載均衡)
- 進程內 LB
- 將LB邏輯集成到消費方,消費方從服務注冊中心獲知有哪些服務地址可用,然后再從這些地址中選擇出一個合適的服務地址。
- Ribbon就屬于進程內LB,它只是一個類庫,集成于消費方進程,消費方通過它來獲取到服務提供方的地址
- 取出來的服務存入jvm并且??定時更新??:默認每30秒(可配置)重新拉取列表,保證數據新鮮度,如果取出來的服務地址有不能用的也會自動選擇其他的能夠使用的
?2、Ribbon機制和架構
- 先選擇 EurekaServer,它優先選擇在同一個區域內負載較少的 server
- 再根據用戶指定的策略,在從 server 取到的服務注冊列表中選擇一個地址
- Ribbon 提供了多種策略∶ 比如輪詢、隨機和根據響應時間加權。
?3、Ribbon常見負載算法
策略名 | 描述 | 特點 |
---|---|---|
BestAvailableRule | 選擇一個最小的并發請求的server。逐個考察Server,如果Server被tripped(跳閘)不能用了,則忽略,再選擇其中ActiveRequestsCount最小的server。 | ??低延遲優先??,適合對響應速度敏感的場景。但是一個一個的看,對服務方來說有一點的資源開銷。 |
AvailabilityFilteringRule | 過濾掉那些因為一直連接失敗的被標記為circuit tripped的后端server,并過濾掉那些高并發的的后端server(active connections超過配置的閾值)。 | ??高可用性??,自動排除故障或過載節點。 |
WeightedResponseTimeRule | 根據響應時間分配一個weight,響應時間越長,weight越小,被選中的可能性越低。 | ??動態權重??,優先選擇響應快的節點。 |
RetryRule | 對選定的負載均衡策略機上重試機制。在一個配置時間段內當選擇server不成功,則一直嘗試使用subRule的方式選擇一個可用的server,達到一定閾值則不再嘗試。 | ??容錯性強??,適合臨時性故障恢復。 |
RoundRobinRule | 輪詢index,選擇index對應位置的server。 | ??公平分配??,按順序輪詢,簡單均衡但無視節點狀態。Ribbon默認是這個 |
RandomRule | 隨機選擇一個server。在index上隨機,選擇index對應位置的server。 | ??無狀態隨機??,適合低復雜度場景。 |
ZoneAvoidanceRule | 復合判斷server所在區域的性能和server的可用性選擇性server。 | ??區域感知??,兼顧性能和跨區域容災,各方面綜合考量。 |
舉例配置(Config)如下 :
@Configuration
public class RibbonRule {//配置注入自己的負載均衡算法@Beanpublic IRule myRibbonRule() {//這里返回的是RandomRule,當然也可以自己指定return new RandomRule();}
}
在啟動類上加如下注解:
//指定Ribbon的負載均衡算法
@RibbonClient(name = "MEMBER_SERVICE_PROVIDER_URL",configuration = RibbonRule.class)