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,意思是将会更换两次实例进行重试。