为feign client增加请求重试机制

本文介绍如何在SpringCloud中使用FeignClient并实现服务调用的重试功能。默认情况下,FeignClient不支持重试,但在服务滚动升级期间可能导致调用失败。为解决此问题,可通过引入spring-retry依赖并配置Retryer Bean来实现重试。但需要注意,只有幂等的方法才会被重试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring cloud通过feign client进行服务之间调用的时候,默认不会进行重试,这样会有一个问题,比如你的服务在滚动升级重启的时候,feign的调用将直接失败,但其实我是滚动重启,重启了一个服务实例,还有另外一个服务实例是可用的,应该允许自动均衡策略重试请求发送到另外一个可用的服务实例上去。

要启用重试机制,首先必须引入spring-retry依赖:

        <dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
        </dependency>

然后通过注册一个bean:

  /**
     *
     * 注册一个重试Bean
     * 默认FeignClient不会进行重试,使用的是{@link feign.Retryer#NEVER_RETRY}
     *
     * @see FeignClientsConfiguration#feignRetryer()
     */
    @Bean
    public Retryer feignRetryer() {
        return new Retryer.Default();
    }

大功告成。

不过还有个前提就是,你的远程调用接口方法的必须是幂等的(比如GET方法认为是幂等的,调用多少次结果都一样,而POST方法有可能有重复提交问题),不然还是不会重试的,因为其他HttpMethod被认为是非幂等的,不能重复执行,因此不能被重试

### Feign远程调用重试机制配置 Feign 提供了一种灵活的方式来处理远程调用中的失败情况,通过内置的 `Retryer` 接口实现自动重试功能。以下是关于如何在 Feign 中配置远程调用重试机制的具体说明。 #### 1. 使用默认重试机制 Feign 自带了一个默认的重试器类 `feign.Retryer.Default`,它会在网络连接失败或其他特定情况下尝试重新发起请求,默认最多会重试五次[^1]。可以通过如下方式启用全局默认重试: ```yaml feign: client: config: default: # 全局配置 retryer: feign.Retryer.Default ``` 上述配置表示对于所有的 Feign 客户端都会应用默认的重试策略。 --- #### 2. 自定义重试逻辑 如果需要更复杂的重试行为,可以自定义一个实现了 `feign.Retryer` 接口的类,并将其注入到 Feign 的配置中。下面是一个简单的例子展示如何创建并设置自定义重试器: ##### 创建自定义 Retryer 类 ```java import feign.RetryableException; import feign.Retryer; public class CustomRetryer implements Retryer { private int attempt = 0; // 当前尝试次数 private final int maxAttempts; // 最大尝试次数 private final long backoffMillis; // 每次等待的时间间隔(毫秒) public CustomRetryer(int maxAttempts, long backoffMillis) { this.maxAttempts = maxAttempts; this.backoffMillis = backoffMillis; } @Override public void continueOrPropagate(RetryableException e) throws Exception { if (attempt++ >= maxAttempts) { // 如果达到最大尝试次数,则抛出异常终止流程 throw e; } Thread.sleep(backoffMillis); // 否则休眠一段时间再重试 } @Override public Retryer clone() { return new CustomRetryer(maxAttempts, backoffMillis); } } ``` 此代码片段展示了如何构建一个具有指定最大重试次数和固定时间间隔的自定义重试器。 ##### 将自定义 Retryer 注入到 Feign 配置中 为了使自定义的重试器生效,需通过 Spring Boot 的 Bean 或者其他方式注册该组件。例如,在 Java 配置文件中完成这一操作: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FeignConfig { @Bean public Retryer customRetryer() { return new CustomRetryer(3, 1000L); // 设置最大重试三次,每次间隔一秒 } } ``` 随后,在启动类或者任意地方加载这个配置即可让其影响整个应用程序内的所有 Feign 调用。 --- #### 3. 结合拦截器使用 除了基本的重试外,还可以利用 Feign 的拦截器来增强调试能力或记录日志等功能。这有助于更好地监控每一次请求及其对应的响应状态码等信息。 --- #### 总结 以上介绍了两种主要的方式用于配置 Feign 的远程调用重试机制——一种是直接采用框架自带的简单方案;另一种则是根据实际需求设计更加精细控制流的解决方案。无论是哪种途径都能有效提升系统的健壮性和用户体验满意度。 ```java // 示例:完整的自定义重试器集成过程 @Bean public Retryer myCustomizedRetryLogic() { return new CustomRetryer(7, 500L); // 假设允许七次重试机会,每半秒钟一次 } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值