feign调用的重试机制,如何关闭

出现场景:

非功能测试期间,配置了feign超时时间45秒,不知道为什么有时候响应结果超时,时间大于45秒,查找具体日志发现,feign发了两次请求;

分析问题

从日志来看,既然大致确定是因为Feign导致请求重发,我们就从分析Feign的重试来着手。

百度得知:
Feign有个Retryer类来控制请求的重试,Retryer是个interface,有两个实现,一个是Retryer.Default,一个是Retryer.NEVER_RETRY。看源码我们得知,Retryer.Default是重试5次,Retryer.NEVER_RETRY是不重试,那Feign默认使用的事哪个实现呢?

feign默认是通过自己包下的Retryer进行重试配置,默认是5次

获取Retryer
在spring的项目中,所有的Bean都是通过Spring容器来管理的。先来看看从Spring管理的bean中能否获取到Retryer,获取到的Retryer是哪个。首先在注解EnableFeignClients有个注解@Import(FeignClientsRegistrar.class),它引入了FeignClientsRegistrar这个配置类
参考源码分析

解决方法:

在配置文件中增加以下配置,解决了会重发请求的问题

ribbon.MaxAutoRetries=0
ribbon.MaxAutoRetriesNextServer=0

版权声明:本文为qq_44691484原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。