Spring Cloud Feign 重试配置

配置

默认是重试策略为Retryer.NEVER_RETRY;
可以修改为Retryer默认实现Retryer.Default;
或者实现Retryer接口自定义实现逻辑.

在Feign重试行为中,它将自动重试IOException,将它们视为与网络临时相关的异常,以及从ErrorDecoder抛出的任何RetryableException

  • 这里可以在ErrorDecoder自定义逻辑根据是否抛出 RetryableException异常来自定义重试逻辑,nice的一比。

方式一

@Configuration
@EnableFeignClients("com.laker.zuul.feign")
public class FeignConfig {
    @Configuration
    public class FooConfiguration {
        @Bean
        Logger.Level feignLoggerLevel() {
            return Logger.Level.BASIC;
        }

    }

    @Bean
    public Retryer feignRetryer() {
        //最大请求次数为5,初始间隔时间为100ms,下次间隔时间1.5倍递增,重试间最大间隔时间为1s,
        return new Retryer.Default();
    }
}

方式二

feign:
  client:
    config:
      feignName:
        connectTimeout: 5000
        readTimeout: 5000
        loggerLevel: full
        errorDecoder: com.example.SimpleErrorDecoder
        retryer: com.example.SimpleRetryer

源码分析

Feign自带的重试机制

首先,在Spring Cloud OpenFeign中,入口为FeignClient,源码如下:

img

FeignClient

所有属性性中,只有configuration看着跟重试有点关系,再看到javadoc提示的@see FeignClientsConfiguration for the defaults,该配置为Feign的默认配置,源码如下:

img

FeignClientsConfiguration

终于见到Retryer本尊,可以看到,当容器中缺少实现Retryer接口的Bean时则自动生成实例并注入(@ConditionalOnMissingBean的功劳),这里注入的是Retryer.NEVER_RETRY,一个不进行重试的Retryer实现类。实现为:

img

Retryer

Retryer有2个方法,重点放在continueOrPropagate(RetryableException e)上,从方法签名上看,要么等待下一次重试,要么将异常Propagate(传播)出去,通俗点就是抛异常。

大家应该都知道,Feign底层使用的是动态代理,才能实现如此简单易用的使用体验。这里主要讲一个类:SynchronousMethodHandler,该类动态代理的主要类,所以它的属性跟Feign的参数很相似,主要源码如下:

img

SynchronousMethodHandler and Feign

invoke(Object[] argv)方法中,当捕获RetryableException异常时,会调用RetryercontinueOrPropagate方法,根据执行结果,该重试的重试,该抛异常的抛异常。

而根据NERVER_RETRY的源码,就是直接抛异常,不进行重试。

参考:

  • https://www.jianshu.com/p/c863556f8de1
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lakernote

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值