如何使用Ribbon
要使用Ribbon首先要添加Ribbon的Maven依赖
org.springframework.cloud
spring-cloud-starter-ribbon
由于Spring Cloud的Eureka依赖中已经包含了Ribbon的依赖,所以要是添加的Eureka依赖则不需要添加以上Ribbon的依赖。
org.springframework.cloud
spring-cloud-starter-eureka
在服务提供方的application.yml文件中配置服务提供方的虚拟IP地址名称。
spring
application
name:provider-user
在服务消费方则只需使用RestTemplate对服务提供方的虚拟IP进行调用,虚拟IP是通过Eureka服务注册表获取到实际的IP地址及端口。
@RestController
public class Controller {
@Autowired
@LoadBalanced
private RestTemplate restTemplate;
@GetMapping("/movie/{id}")
public User findById(@PathVariable Long id) {
return this.restTemplate.getForObject("http://provider-user/simple/" + id, User.class);
}
}
上面例子中"http://provider-user/simple/" + id中的provider-user即为服务提供方的虚拟IP名称。
而给RestTemplate实例加上@LoadBalanced注解,使得RestTemplate能够拥有负载均衡的能力。
Ribbon是客户端服务发现,Ribbon拥有客户端负载均衡的能力,Ribbon提供了多种负载均衡算法。
1、RandomRule 随机模式
2、RoundRobinRule 轮询模式
3、BestAvailableRule 跳过熔断的服务,获取请求数最少的服务.通常与ServerListSubsetFilter一起使用.
4、WeightedResponseTimeRule 权重的方式挑选服务.服务实例响应时间越小的服务,则更容易被选中
5、RetryRule 在RoundRobinRule的基础上,增加了重试的机制
以上负载均衡算法实现类都是实现了IRule接口,IRule还默认提供一些其他的算法实现,此处只列举除了部分常用的。
Ribbon默认是轮询的方式进行负载均衡。
Ribbon的负载均衡实现
通过配置Bean的方式实现自定义负载均衡:
在服务消费方的启动类上增加@RibbonClient(name = “provider-user”, configuration = TestConfiguration.class)注解,其中name的值为被调用微服务,TestConfiguration为配制的负载均衡类。
@Configuration
@ExcludeFromComponentScan
public class TestConfiguration {
@Bean
public IRule ribbonRule() {
return new RandomRule();
}
}
其中配置的ribbonRule Bean实现了随机算法。
注意TestConfiguration 类不能位于启动类的同级或同级的文件夹目录下。
因为启动类启动时会扫描到TestConfiguration 类,导致所有的调用服务的负载均衡算法都使用以上实现的算法。
若TestConfiguration 类位于启动类同级的目录下,则可以定义一个空注解@ExcludeFromComponentScan,在TestConfiguration上标注此注解。然后在启动类上使用@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class) }) 注解来过滤被自定义注解标注的类,不让该类被扫描。
通过在application.yml文件中配置的方式实现自定义负载均衡:
在application.yml文件中作如下配置:
microservice-provider-user:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
即可实现随机负载均衡算法。