Ribbon是Spring Cloud微服務體系的彈性拓張組件,與其餘組件結合能夠發揮出強大的做用。此外,它具有了豐富的負載均衡策略,重試機制。支持多協議的異步與響應模型,容錯,緩存與批處理等功能可讓你很容易的構建本身的微服務架構.
複製代碼
負載均衡常見的有軟件負載很硬件負載,表明的產品蛋Nginx與F5;Ribbon和他們的區別就是集中式負載均衡與進程內負載均衡
的區別。集中式負載均衡是指位於因特網與服務提供者之間,並負責吧網絡請求轉發到各個提供單位,這個時候Nginx與F5就
能夠劃分爲一類了,也能夠成爲服務端負載均衡策略。進程內負載均衡就是從一個實例庫選取一個實例進行流量導入,在微
服務的範疇內,實例庫通常是存儲在Eureka,Consul,Zookeeper,etcd這樣的註冊中心。
複製代碼
ribbon的負載均衡策略主要包括如下幾種:spring
策略類 | 命名 | 描述 |
---|---|---|
RandomRule | 隨機策略 | 隨機選擇server |
RoundRobinRule | 輪詢策略 | 按順序選擇server |
RetryRule | 重試策略 | 在一個配置時間段內當選擇server不成功,則一直嘗試選擇一個可用的server |
BestAvailableRule | 最低併發策略 | 逐個考察server,若是server斷路器打開,則忽略,在選擇其中併發連接最低的server |
AvailabilityFilteringRule | 可用過濾策略 | 過濾掉一直連接失敗並標記爲circuit tripped的server,過濾掉哪些高併發連接 |
ResponseTimeWeightedRule | 響應時間加權策略 | 根據server的響應時間分配權重。響應時間越長,權重越低,被選擇到的概略就越低,權重越高,被選擇到的機率就越高。 |
ZoneAvoidanceRule | 區域權衡策略 | 綜合判斷server所在的區域的性能和server的可用性輪詢選擇server,而且斷定一個AWS Zobe的運行性能是否可用,提出不可用的Zone中全部server。 |
@Configuration
public class MyConfiguration{
@Bean
public IRule ribbonRule(){
return new RandomRule();
}
}
複製代碼
若是咱們使用不想針對全局設置,那麼能夠針對服務源進行特殊的策略配置,可使用@RibbonClient註解,只需稍微修改上面的代碼便可,@RibbonClient註解主要用來對原服務進行約束。緩存
@Configuration
@AvoidScan
public class MyConfiguration{
@Bean
public IRule ribbonRule(){
return new RandomRule();
}
}
在啓動類裏面加上以下的註解便可完成針對具體的服務源使用不一樣的負載均衡策略,使用@AvoidScan註解告訴Spring容器不要去掃描該註解,具體的服務源是使用特定的配置指定特定負載均衡的策略。
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@RibbonClient(name = "ribbon-client",configuration = MyConfiguration.class)
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = AvoidScan.class)})
public class RibbonBalancerApplication {
//定義一個負載均衡的RestTemplate
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RibbonBalancerApplication.class,args);
}
}
複製代碼
除了上面的針對服務源使用不一樣的策略以外,還可使用@RibbonClients針對多個服務源進行策略的指定。網絡
@RibbonClients(value = {
@RibbonClient(name = "ribbon-client",configuration = MyConfiguration.class),
@RibbonClient(name = "ribbon-client-b",configuration = MyConfiguration.class)
})
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = AvoidScan.class)})
複製代碼
使用SpringBoot的優勢是習慣優於配置,大多數的配置都是SpringBoot已經幫助咱們配置好的,可是少數的狀況下,咱們能夠經過少許配置文件去自義咱們的字定義的配置咱們的負載均衡策略,具體的語法以下:架構
clientname:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadBalancer.RandomRule
複製代碼
使用HTTP發起請求,免不了要經歷極端的環境,此時對調用進行時限控制以及時限以後的重試很重要。 正常狀況咱們可使用下面的代碼開啓ribbon重試的機制,可是F版以後就默認開啓了,無需手動配置重試機制的開啓,咱們要作的就是要作的就是要配置時限。併發
使用spring.cloud.loadbalancer.retry.enabled: true開啓服務重試的機制
//ribbon內部的配置類
@ConfigurationProperties("spring.cloud.loadbalancer.retry")
public class LoadBalancerRetryProperties {
private boolean enabled = true;
public LoadBalancerRetryProperties() {
}
public boolean isEnabled() {
return this.enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
}
複製代碼
具體的配置可使用下面的配置負載均衡
ribbon-client:
ribbon:
ConnectTimeout: 3000
ReadTimeout: 60000
MaxAutoRetries: 1 #對第一次請求的服務的重試次數
MaxAutoRetriesNextServer: 1 #要重試的下一個服務的最大數量(不包括第一個服務)
OkToRetryOnAllOperations: true
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule#
複製代碼
Ribbon在進行客戶端負載均衡的時候並非在啓動的時候就加載上下文的,實在實際請求的時候才加載,有點像servlet的第一次請求的時候纔去生成實例,這回致使第一次請求會比較的緩慢,甚至可能會出現超時的狀況。因此咱們能夠指定具體的客戶端名稱來開啓飢餓加載,即在啓動的時候便加載素養的配置項的應用上下文。dom
ribbon:
eager-load:
enabled: true
clients: ribbon-client-a, ribbon-client-b, ribbon-client-c
複製代碼