Java实现第三方 HTTP 接口重试实现方式

 更新时间:2026年02月09日 09:47:38   作者:思静鱼  
本文主要介绍了Java实现第三方 HTTP 接口重试实现方式,包括手写循环重试、使用SpringRetry、Feign+Resilience4j、GuavaRetryer和MQ延迟重试,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

第三方 HTTP 接口重试的编码实现方式,这类场景在 Java 里非常常见,比如:

  • 订单系统调用第三方支付接口
  • 网关调用外部认证服务
  • Java 服务调用算法 HTTP 服务

1. 手写循环重试(最简单)

直接用 for 循环 + try/catch 来控制:

public String callThirdPartyApi(String url) {
    int maxRetries = 3; // 最大重试次数
    int retryDelay = 2000; // 毫秒
    for (int i = 1; i <= maxRetries; i++) {
        try {
            HttpResponse<String> response = Unirest.get(url).asString();
            if (response.getStatus() == 200) {
                return response.getBody();
            }
        } catch (Exception e) {
            System.err.println("第 " + i + " 次调用失败: " + e.getMessage());
        }
        try {
            Thread.sleep(retryDelay); // 间隔
        } catch (InterruptedException ignored) {}
    }
    throw new RuntimeException("调用接口失败,已重试 " + maxRetries + " 次");
}

简单易懂
不支持指数退避、异常分类,适合小项目

2. 使用 Spring Retry(推荐)

Spring 提供的 注解驱动重试,非常适合调用第三方接口:

@Service
public class ThirdPartyApiService {

    @Retryable(
        value = {SocketTimeoutException.class, IOException.class}, // 哪些异常可重试
        maxAttempts = 3,  // 最大重试次数
        backoff = @Backoff(delay = 2000, multiplier = 2) // 2s, 4s, 8s
    )
    public String callApi(String url) {
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.getForObject(url, String.class);
    }

    // 超过最大重试次数后的兜底逻辑
    @Recover
    public String recover(Exception e, String url) {
        System.err.println("接口调用失败,进入降级逻辑: " + e.getMessage());
        return "fallback";
    }
}

特点:支持 注解 + 指数退避 + 异常分类 + 兜底逻辑
依赖 spring-retryspring-aspects

3. 使用 Feign + Resilience4j

如果你用的是 Spring Cloud / OpenFeign,可以加上 Resilience4j Retry

@FeignClient(name = "thirdPartyApi", url = "https://api.example.com", configuration = RetryConfig.class)
public interface ThirdPartyClient {
    @GetMapping("/data")
    String getData();
}

配置 Resilience4j Retry:

resilience4j.retry:
  instances:
    thirdPartyRetry:
      maxAttempts: 3
      waitDuration: 2s
      enableExponentialBackoff: true
      exponentialBackoffMultiplier: 2

特点:适合微服务架构,支持 熔断、限流、重试 一体化
配置稍微复杂

4. 使用 Guava Retryer(灵活、轻量)

Google Guava 提供 Retryer,适合单独使用:

Retryer<String> retryer = RetryerBuilder.<String>newBuilder()
        .retryIfExceptionOfType(IOException.class) // 遇到 IOException 重试
        .retryIfResult(Objects::isNull) // 返回结果为空也重试
        .withWaitStrategy(WaitStrategies.exponentialWait(2, 10, TimeUnit.SECONDS)) // 指数退避
        .withStopStrategy(StopStrategies.stopAfterAttempt(3)) // 最多 3 次
        .build();

public String callThirdPartyApi(String url) {
    try {
        return retryer.call(() -> {
            HttpResponse<String> response = Unirest.get(url).asString();
            if (response.getStatus() != 200) {
                throw new IOException("HTTP " + response.getStatus());
            }
            return response.getBody();
        });
    } catch (Exception e) {
        throw new RuntimeException("调用失败", e);
    }
}

特点:轻量灵活,支持复杂策略(比如随机抖动)
需要额外依赖 Guava Retryer

5. 高级:MQ + 延迟重试(分布式场景)

如果第三方接口经常不稳定,可以采用 消息队列延迟重试

  • 请求失败 → 写入 MQ 延迟队列(如 RabbitMQ TTL、Kafka 延时消息)
  • 延迟 N 秒后再消费,进行重试
  • 超过最大次数 → 死信队列(DLQ),人工处理

特点:解耦、可观测、适合高并发分布式系统
引入 MQ,复杂度更高

总结

第三方 HTTP 接口重试实现方式有:

  1. 手写 for 循环(简单粗暴)
  2. Spring Retry(主流、优雅,推荐)
  3. Feign + Resilience4j(适合微服务)
  4. Guava Retryer(灵活轻量)
  5. MQ 延迟重试(分布式 & 高可靠场景)

建议:业务系统用 Spring Retry / Resilience4j,跨系统对接用 MQ 延迟重试兜底

到此这篇关于Java实现第三方 HTTP 接口重试实现方式的文章就介绍到这了,更多相关Java 第三方HTTP接口重试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • SpringBoot项目Docker部署三种方式

    SpringBoot项目Docker部署三种方式

    本文主要介绍了SpringBoot项目Docker部署三种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • MyBatis 在使用上的注意事项及其辨析(最新最全整理)

    MyBatis 在使用上的注意事项及其辨析(最新最全整理)

    这篇文章主要介绍了MyBatis的在使用上的注意事项及其辨析,本文内容比较长,是小编用心给大家整理的,图文实例代码相结合给大家讲解的非常详细,需要的朋友参考下吧
    2024-06-06
  • maven中的scope与systemPath用法

    maven中的scope与systemPath用法

    这篇文章主要介绍了maven中的scope与systemPath用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java Zookeeper分布式分片算法超详细讲解流程

    Java Zookeeper分布式分片算法超详细讲解流程

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等
    2023-03-03
  • Java使用FTP上传文件并模拟接受的方法

    Java使用FTP上传文件并模拟接受的方法

    这篇文章主要介绍了Java使用FTP上传文件并模拟接受的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Java中的内部类使用详情

    Java中的内部类使用详情

    说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉。原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法。今天我们就来一探究竟
    2022-03-03
  • spring kafka框架中@KafkaListener 注解解读和使用案例

    spring kafka框架中@KafkaListener 注解解读和使用案例

    Kafka 目前主要作为一个分布式的发布订阅式的消息系统使用,也是目前最流行的消息队列系统之一,这篇文章主要介绍了kafka @KafkaListener 注解解读,需要的朋友可以参考下
    2023-02-02
  • eclipse实现ElGamal数字签名

    eclipse实现ElGamal数字签名

    这篇文章主要为大家详细介绍了eclipse实现ElGamal数字签名,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • 如何优雅的处理Spring Boot异常信息详解

    如何优雅的处理Spring Boot异常信息详解

    这篇文章主要给大家介绍了关于如何优雅的处理Spring Boot异常信息的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • SpringCloud-Nacos服务注册与发现方式

    SpringCloud-Nacos服务注册与发现方式

    这篇文章主要介绍了SpringCloud-Nacos服务注册与发现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论