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表示是否所有操作都重试。结果和上面类似。

posted @   shigp1  阅读(1257)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示