Feign中Ribbon的配置

通过12.1.2节最后的日志可以看到,Feign 的负载均衡使用的还是 Ribbon。当然,在 Eureka 中,使用 RestTemplate 的时候也存在 Ribbon。在使用 Feign 的时候,我们也要注意 Ribbon 的配置。因此,这里会对 Feign 中 Ribbon 的配置做一个说明。

全局配置与指定服务的配置

对于配置,存在全局配置,也存在对某个指定服务的配置。

全局配置

在 Feign 中,对于全局配置的修改,遵循下面的规则:ribbon.<key>=<value>。下面看一个实例。

ribbon.ConnectionTimeout=1000

这样,全局配置就配置好了。

指定服务的配置

全局配置比较简单,但有时还是需要针对特别的应用服务做一些配置,这样就需要单独个性化配置,而且这种配置和服务有关系。个性化配置的规则:<client>.ribbon.<key>=<value>。

解释一下 client 的来源。使用 Feign 需要定义一个接口,然后添加注解 @FeignClient(×××),其中注解中的 “×××” 就是 client 应用名。在使用这个注解的时候,将会创建一个 Feign 客户端,这个是必然的,但同时也创建了一个 Ribbon 的客户端,这个客户端还是 ××× 客户端。所以,我们在配置时,直接使用应用名即可。实例如下所示。

helloService.ribbon.ConnectionTimeout=1000

重试机制

在 Feign 中默认使用 Ribbon 的重试机制。关于超时的设置,在 Spring Cloud 中,主要有三个层面,网关 Zuul、Ribbon 和 Hystrix。

这里还没开始讲解 Hystrix 的熔断机制,虽然看起来和 Feign 的重试机制有些相同,但还是有本质区别的。在这里,我们先了解 Ribbon 在 Feign 中的重试机制,涉及超时的问题。此处先看如何进行超时重试的配置,配置如下所示。

helloService.ribbon.ConnectionTimeout=1000
helloService.ribbon.ReadTimeout=2000
helloService.ribbon.okToRetryOnAllOperations=true
helloService.ribbon.MaxAutoRetriesNextServer=2
helloService.ribbon.MaxAutoRetries=1

对于这几个配置,结合实例更方便说明。下面是服务提供者的程序,我们新加一个 Rest 接口,重要的是看使用方式,代码如下所示。

package com.cloudtest.eurekaprovider.controller;
@RestController
public class PrintInfo {
   @GetMapping("/printInfo")
   public String printInfo() {
      int time=new Random().nextInt(3000);
      try {
          System.out.println("time:"+time);
          Thread.sleep(time);
      } catch (InterruptedException e) {
          e.printStackTrace();
      }
      System.out.println("==printInfo+=");
      return "print info";
   }
}

在这段代码中,使用 Random 类随机让线程休眠一段时间,这样可以重现出重试的效果。例如第一次休眠时间为 2500ms,肯定超时,启动重试机制,当第二次休眠时间小于 2000ms 时,就可以成功调用。

现在说明一下我们的部分配置项:Ribbon.MaxAutoRetries 设置为 1 的意思是先访问首选的实例一次,如果失败,则更换实例进行访问;Ribbon.MaxAutoRetriesNextServer 设置为 2,意思是将会更换两次实例进行重试。