如何使用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

即可实现随机负载均衡算法。