Spring Cloud LoadBalancer重试策略解析

834 阅读1分钟

我们在使用Feign调用服务的时候,重试策略其实是受两个配置的影响,一个是Fegin自身的重试策略Retryer.NEVER_RETRY,Retryer.Default,默认重试策略是Retryer.NEVER_RETRY,这将禁用重试。需要注意的是即使默认是Retryer.NEVER_RETRY,仍有可能重试,那就是LoadBalancer的重试策略起作用。

image.png

可以看到,loadBalancer重试开启的条件是

  1. 有引入spring-retry.jar包
  2. 配置spring.cloud.loadbalancer.retry.enabled=true,注意如果不配置也是开启

重试策略在BlockingLoadBalancedRetryPolicy 这个类,可以看到只有Get请求方式才会重试.如果配置了retryOnAllOperations=true,则所有请求类型都会重试,默认这个值是false

image.png

容易踩坑的点:

  1. 有时候我们并不想要feign请求异常时进行重试,然后又直接或间接引入的了spring-retry.jar包,这个时候是开启重试的,只有把spring.cloud.loadbalancer.retry.enabled=true 设置为false才是关闭。
  2. 所有非查询类的请求避免使用GET方式。默认情况下重试只会对Get进行重试,如果使用了Get方式进行了数据插入操等非幂等操作,容易造成数据错误。