1. Ribbon
Ribbon是Netflix發(fā)布的云中間層服務開源項目错英,主要功能是提供客戶端實現(xiàn)負載均衡算法。
如下是幾種負載均衡策略:
策略 | 說明 |
---|---|
RoundRobinRule 輪詢策略 | 默認值疙剑,啟動的服務被循環(huán)訪問 |
RandomRule 隨機選擇 | 隨機從服務器列表中選擇一個訪問 |
BestAvailableRule 最大可用策略 | 先過濾出故障服務器,再選擇一個當前并發(fā)請求數(shù)最小的服務 |
WeightedResponseTimeRule 帶有加權的輪詢策略 | 對各個服務器響應時間進行加權處理践叠,再采用輪詢的方式獲取相應的服務器 |
AvailabilityFilteringRule 可用過濾策略 | 先過濾出故障的或并發(fā)請求大于閾值的服務實例言缤,再以線性輪詢的方式從過濾后的實例清單中選出一個 |
ZoneAvoidanceRule 區(qū)域感知策略 | 先使用主過濾條件(區(qū)域負載器,選擇最優(yōu)區(qū)域)對所有實例過濾并返回過濾后的實例清單禁灼,依次使用次過濾條件列表中的過濾條件對主過濾條件的結果進行過濾管挟,判斷最小過濾數(shù)(默認1)和最小過濾百分比(默認0),最后對滿足條件的服務器則使用RoundRobinRule(輪詢方式)選擇一個服務器實例 |
2. 使用方法
- 引入Ribbon依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
- RestTemplate 使用注解 @LoadBalanced
@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplication {
// @LoadBalanced 讓RestTemplate啟用客戶端負載均衡
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args){
SpringApplication.run(ConsumerApplication.class, args);
}
}
- Controller中引入Bean
@RestController
public class TestController {
@Autowired
@Qualifier(value = "restTemplate")
private RestTemplate restTemplate;
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test(){
return restTemplate.getForEntity("http://SERVICE-TEST/test", String.class).getBody();
}
}
3.修改負載均衡策略
默認的的策略是循環(huán)訪問弄捕,可修改配置改變策略
1)全局配置僻孝,所有的RibbonClient都使用此策略
@Configuration
public class RibbonGlobalLoadBalanceConfig {
/**
* 隨機原則
* @return
*/
@Bean
public IRule ribbonRule(){
return new RandomRule();
}
}
2)通過配置文件application.properties (或 application.yml)配置單個服務的策略导帝,SERVICE-TEST是服務ID
SERVICE-TEST.ribbon.NFLoadBalancerRuleClassName = com.netflix.loadbalancer.RandomRule
3)通過注解
- 自定義注解,標記不自動掃描類
public @interface IgnoreScan {
}
- 配置策略穿铆,使用不自動掃描注解您单。如果包含在應用程序上下文的@ComponentScan中,則該類的配置信息就被所有的@RibbonClient共享
@Configuration
@IgnoreScan
public class CustomLoadBalanceConfig {
@Bean
public IRule ribbonRule(){
return new RandomRule();
}
}
- 啟動類荞雏,定義組件掃碼 和 設置服務的負載均衡策略
@RibbonClient(name = "SERVICE-TEST", configuration = CustomLoadBalanceConfig.class)
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value =IgnoreScan.class)})