openfeign超时重试
通过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表示是否所有操作都重试。结果和上面类似。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异