通过http调用服务受网络影响较大,当网络波动时,http调用可能会失败,需要去重试,可以手动重试,这样代码会很不优雅。所幸feign有自己的超时重试机制,Ribbon的重试机制和Feign的重试机制有冲突,所以源码中默认关闭Feign的重试机制。
样例搭建
修改Producer模块中的controller,将
@RequestMapping("/hello")
public String hello(String name) {
return "hello," + name + "," + port;
}
修改为:
private AtomicInteger count = new AtomicInteger();
@RequestMapping("/hello")
public String hello(String name, HttpServletResponse response) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
int i = count.addAndGet(1);
System.out.println("调用次数:"+i);
return "hello," + name + "," + port;
}
用睡眠时间模拟处理请求。
修改端口为8000,上面的睡眠时间为1000后启动。然后修改端口为8002,上面的睡眠时间为4000,启动。
feign提供的超时重试
feign.client.config.default.connectTimeout=1000
feign.client.config.default.readTimeout=2000
connectTimeout是连接超时时间(ms),readTimeout是业务逻辑超时时间(ms),readTimeout设置为2000ms,上面启动了两个服务,一个睡眠了1000ms,模拟处理不超时,一个睡眠了4000ms,模拟处理超时。default表示对所有feign都起作用,如果要对单个feign起作用将default改成feign要调用的服务名。
通过openfeign+ribbon调用服务,访问http://localhost:8003/helloByFeign,第一次调用了端口为8000的服务,得到结果为:hello,张三,8000。再次访问http://localhost:8003/helloByFeign,第一次调用了端口为8002的服务,可以看到:
openfeign提供的重试次数是默认关闭的。要开启openfeign的重试机制,在application.properties配置:
feign.client.config.default.retryer=feign.Retryer.Default
也可以通过配置类配置:
@Bean
public Retryer retryer() {
return new Retryer.Default(1000,3000,2);
}
第一个参数是重试间隔时间,第二个参数是最大重试间隔时间,第三个参数是最大重试次数。
重启两个Producer服务提供方。然后访问http://localhost:8003/helloByFeign,第一次调用端口为8000的服务,看到控制台:
第二次调用,调用端口为8002的服务:
发了一次请求调用了两次服务。多点几次,查看控制台。
端口为8000的服务:
端口为8002的服务:
可以看到随着调用次数的增多,越来越多的调用往通的服务方,但是还有较少的次数去调用不通的服务方。
ribbon提供的超时重试
在application.properties配置:
ribbon.connectTimeout=1000
ribbon.readTimeout=2000
ribbon.MaxAutoRetries=2
ribbon.MaxAutoRetriesNextServer=2
ribbon.OkToRetryOnAllOperations=false
connectTimeout和readTimeout与feign的意思相同。MaxAutoRetries表示同一台实例最大重试次数,不包括首次调用,MaxAutoRetriesNextServer表示重试负载均衡其他的实例最大重试次数,不包括首次调用,OkToRetryOnAllOperations表示是否所有操作都重试。结果和上面类似。
标签:feign,调用,openfeign,重试,超时,hello,ribbon From: https://www.cnblogs.com/shigongp/p/17279135.html