Ribbon的負載均衡策略有:
策略類 | 命名 | 描述 |
RandomRule | 隨機策略 | 隨機選擇server |
RoundRobinRule | 輪詢策略 | 輪詢選擇, 輪詢index,選擇index對應位置的Server; |
RetryRule | 重試策略 | 對選定的負載均衡策略機上重試機制,在一個配置時間段內當選擇Server不成功,則一直嘗試使用subRule的方式選擇一個可用的server; |
BestAvailableRule | 最低並發策略 | 逐個考察server,如果server斷路器打開,則忽略,再選擇其中並發鏈接最低的server |
AvailabilityFilteringRule | 可用過濾策略 | 過濾掉一直失敗並被標記為circuit tripped的server,過濾掉那些高並發鏈接的server(active connections超過配置的閾值)或者使用一個AvailabilityPredicate來包含過濾server的邏輯,其實就就是檢查status里記錄的各個Server的運行狀態; |
ResponseTimeWeightedRule | 響應時間加權重策略 | 根據server的響應時間分配權重,響應時間越長,權重越低,被選擇到的概率也就越低。響應時間越短,權重越高,被選中的概率越高,這個策略很貼切,綜合了各種因素,比如:網絡,磁盤,io等,都直接影響響應時間 |
ZoneAvoidanceRule | 區域權重策略 | 綜合判斷server所在區域的性能,和server的可用性,輪詢選擇server並且判斷一個AWS Zone的運行性能是否可用,剔除不可用的Zone中的所有server |
可以使用代碼配置和屬性配置的方式為某一個微服務提供輪詢策略,比如A服務使用隨即策略,B服務使用輪詢策略。。
代碼配置:
代碼示例
-
創建一個空類,並在其上添加
@Configuration
注解和@RibbonClient
注解。
/** * 使用RibbonClient,為特定的目標服務 user 自定義配置。 * 使用@RibbonClient的configuration屬性,指定Ribbon的配置類。 */ @Configuration @RibbonClient(name = "user", configuration = RibbonConfiguration.class) public class TestConfiguration { }
由代碼可知,使用@RibbonClient
注解的configuration屬性,即可自定義指定名稱Ribbon客戶端的配置。
- 創建Ribbon的配置類。
/** * 該類為Ribbon的配置類 * 注意:該類不能放在主應用程序上下文@ComponentScan所掃描的包中,否則配置將會被所有Ribbon Client共享。*/ @Configuration public class RibbonConfiguration { @Bean public IRule ribbonRule() { // 負載均衡規則,改為隨機 return new RandomRule(); } }
注意:該類不能放在主應用程序上下文@ComponentScan所掃描的包中,否則配置將會被所有Ribbon Client共享。
如果放到掃描包里面,那也可以自定義注解,標記不自動掃描類:
public @interface IgnoreScan { }
然后配置策略,使用不自動掃描注解:
@Configuration @IgnoreScan //這是自定義的注解 public class CustomLoadBalanceConfig { @Bean public IRule ribbonRule(){ return new RandomRule(); } }
最后在啟動類,定義組件掃碼 和 設置服務的負載均衡策略:
@RibbonClient(name = "user", configuration = CustomLoadBalanceConfig.class)//這里指定了使用上面的configuration,name是服務id @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value =IgnoreScan.class)})
屬性配置
代碼示例:
user:#這個是微服務的id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #隨機策略
屬性配置的優先級高於代碼配置。
除了上面的針對某一個微服務的細粒度的配置,還可以全局配置,Ribbon只支持使用代碼實現全局配置。
全局配置:
//首先定義一個空類,使用@RibbonClients
@RibbonClients(defaultConfiguration = DefaultRibbonConfig.class) public class RibbonClientDefaultConfigurationTestsConfig { }
//然后定義一個config類,指定使用的負載均衡策略 @Configuration public class DefaultRibbonConfig { @Bean public IRule ribbonRule() { return new RandomRule(); } }