我们在使用Feign调用服务的时候,重试策略其实是受两个配置的影响,一个是Fegin自身的重试策略Retryer.NEVER_RETRY,Retryer.Default,默认重试策略是Retryer.NEVER_RETRY,这将禁用重试。需要注意的是即使默认是Retryer.NEVER_RETRY,仍有可能重试,那就是LoadBalancer的重试策略起作用。
可以看到,loadBalancer重试开启的条件是
- 有引入spring-retry.jar包
- 配置spring.cloud.loadbalancer.retry.enabled=true,注意如果不配置也是开启
重试策略在BlockingLoadBalancedRetryPolicy 这个类,可以看到只有Get请求方式才会重试.如果配置了retryOnAllOperations=true,则所有请求类型都会重试,默认这个值是false
容易踩坑的点:
- 有时候我们并不想要feign请求异常时进行重试,然后又直接或间接引入的了spring-retry.jar包,这个时候是开启重试的,只有把spring.cloud.loadbalancer.retry.enabled=true 设置为false才是关闭。
- 所有非查询类的请求避免使用GET方式。默认情况下重试只会对Get进行重试,如果使用了Get方式进行了数据插入操等非幂等操作,容易造成数据错误。