RIBBON的負載均衡策略
阿新 • • 發佈:2021-01-07
RIBBON的負載均衡策略及使用方法
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();
}
}