1. Ribbon
Ribbon是Netflix发布的云中间层服务开源项目,主要功能是提供客户端实现负载均衡算法。
如下是几种负载均衡策略:
策略 | 说明 |
---|---|
RoundRobinRule 轮询策略 | 默认值,启动的服务被循环访问 |
RandomRule 随机选择 | 随机从服务器列表中选择一个访问 |
BestAvailableRule 最大可用策略 | 先过滤出故障服务器,再选择一个当前并发请求数最小的服务 |
WeightedResponseTimeRule 带有加权的轮询策略 | 对各个服务器响应时间进行加权处理,再采用轮询的方式获取相应的服务器 |
AvailabilityFilteringRule 可用过滤策略 | 先过滤出故障的或并发请求大于阈值的服务实例,再以线性轮询的方式从过滤后的实例清单中选出一个 |
ZoneAvoidanceRule 区域感知策略 | 先使用主过滤条件(区域负载器,选择最优区域)对所有实例过滤并返回过滤后的实例清单,依次使用次过滤条件列表中的过滤条件对主过滤条件的结果进行过滤,判断最小过滤数(默认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.修改负载均衡策略
默认的的策略是循环访问,可修改配置改变策略
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)})