最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)第三方 HTTP 接口重試實(shí)現(xiàn)方式

 更新時(shí)間:2026年02月09日 09:47:38   作者:思靜魚  
本文主要介紹了Java實(shí)現(xiàn)第三方 HTTP 接口重試實(shí)現(xiàn)方式,包括手寫循環(huán)重試、使用SpringRetry、Feign+Resilience4j、GuavaRetryer和MQ延遲重試,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

第三方 HTTP 接口重試的編碼實(shí)現(xiàn)方式,這類場景在 Java 里非常常見,比如:

  • 訂單系統(tǒng)調(diào)用第三方支付接口
  • 網(wǎng)關(guān)調(diào)用外部認(rèn)證服務(wù)
  • Java 服務(wù)調(diào)用算法 HTTP 服務(wù)

1. 手寫循環(huán)重試(最簡單)

直接用 for 循環(huán) + try/catch 來控制:

public String callThirdPartyApi(String url) {
    int maxRetries = 3; // 最大重試次數(shù)
    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 + " 次調(diào)用失敗: " + e.getMessage());
        }
        try {
            Thread.sleep(retryDelay); // 間隔
        } catch (InterruptedException ignored) {}
    }
    throw new RuntimeException("調(diào)用接口失敗,已重試 " + maxRetries + " 次");
}

簡單易懂
不支持指數(shù)退避、異常分類,適合小項(xiàng)目

2. 使用 Spring Retry(推薦)

Spring 提供的 注解驅(qū)動(dòng)重試,非常適合調(diào)用第三方接口:

@Service
public class ThirdPartyApiService {

    @Retryable(
        value = {SocketTimeoutException.class, IOException.class}, // 哪些異??芍卦?
        maxAttempts = 3,  // 最大重試次數(shù)
        backoff = @Backoff(delay = 2000, multiplier = 2) // 2s, 4s, 8s
    )
    public String callApi(String url) {
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.getForObject(url, String.class);
    }

    // 超過最大重試次數(shù)后的兜底邏輯
    @Recover
    public String recover(Exception e, String url) {
        System.err.println("接口調(diào)用失敗,進(jìn)入降級(jí)邏輯: " + e.getMessage());
        return "fallback";
    }
}

特點(diǎn):支持 注解 + 指數(shù)退避 + 異常分類 + 兜底邏輯
依賴 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

特點(diǎn):適合微服務(wù)架構(gòu),支持 熔斷、限流、重試 一體化
配置稍微復(fù)雜

4. 使用 Guava Retryer(靈活、輕量)

Google Guava 提供 Retryer,適合單獨(dú)使用:

Retryer<String> retryer = RetryerBuilder.<String>newBuilder()
        .retryIfExceptionOfType(IOException.class) // 遇到 IOException 重試
        .retryIfResult(Objects::isNull) // 返回結(jié)果為空也重試
        .withWaitStrategy(WaitStrategies.exponentialWait(2, 10, TimeUnit.SECONDS)) // 指數(shù)退避
        .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("調(diào)用失敗", e);
    }
}

特點(diǎn):輕量靈活,支持復(fù)雜策略(比如隨機(jī)抖動(dòng))
需要額外依賴 Guava Retryer

5. 高級(jí):MQ + 延遲重試(分布式場景)

如果第三方接口經(jīng)常不穩(wěn)定,可以采用 消息隊(duì)列延遲重試

  • 請(qǐng)求失敗 → 寫入 MQ 延遲隊(duì)列(如 RabbitMQ TTL、Kafka 延時(shí)消息)
  • 延遲 N 秒后再消費(fèi),進(jìn)行重試
  • 超過最大次數(shù) → 死信隊(duì)列(DLQ),人工處理

特點(diǎn):解耦、可觀測、適合高并發(fā)分布式系統(tǒng)
引入 MQ,復(fù)雜度更高

總結(jié)

第三方 HTTP 接口重試實(shí)現(xiàn)方式有:

  1. 手寫 for 循環(huán)(簡單粗暴)
  2. Spring Retry(主流、優(yōu)雅,推薦)
  3. Feign + Resilience4j(適合微服務(wù))
  4. Guava Retryer(靈活輕量)
  5. MQ 延遲重試(分布式 & 高可靠場景)

建議:業(yè)務(wù)系統(tǒng)用 Spring Retry / Resilience4j,跨系統(tǒng)對(duì)接用 MQ 延遲重試兜底

到此這篇關(guān)于Java實(shí)現(xiàn)第三方 HTTP 接口重試實(shí)現(xiàn)方式的文章就介紹到這了,更多相關(guān)Java 第三方HTTP接口重試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot項(xiàng)目Docker部署三種方式

    SpringBoot項(xiàng)目Docker部署三種方式

    本文主要介紹了SpringBoot項(xiàng)目Docker部署三種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • MyBatis?在使用上的注意事項(xiàng)及其辨析(最新最全整理)

    MyBatis?在使用上的注意事項(xiàng)及其辨析(最新最全整理)

    這篇文章主要介紹了MyBatis的在使用上的注意事項(xiàng)及其辨析,本文內(nèi)容比較長,是小編用心給大家整理的,圖文實(shí)例代碼相結(jié)合給大家講解的非常詳細(xì),需要的朋友參考下吧
    2024-06-06
  • maven中的scope與systemPath用法

    maven中的scope與systemPath用法

    這篇文章主要介紹了maven中的scope與systemPath用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java?Zookeeper分布式分片算法超詳細(xì)講解流程

    Java?Zookeeper分布式分片算法超詳細(xì)講解流程

    ZooKeeper是一個(gè)分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等
    2023-03-03
  • Java使用FTP上傳文件并模擬接受的方法

    Java使用FTP上傳文件并模擬接受的方法

    這篇文章主要介紹了Java使用FTP上傳文件并模擬接受的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Java中的內(nèi)部類使用詳情

    Java中的內(nèi)部類使用詳情

    說起內(nèi)部類這個(gè)詞,想必很多人都不陌生,但是又會(huì)覺得不熟悉。原因是平時(shí)編寫代碼時(shí)可能用到的場景不多,用得最多的是在有事件監(jiān)聽的情況下,并且即使用到也很少去總結(jié)內(nèi)部類的用法。今天我們就來一探究竟
    2022-03-03
  • spring kafka框架中@KafkaListener 注解解讀和使用案例

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

    Kafka 目前主要作為一個(gè)分布式的發(fā)布訂閱式的消息系統(tǒng)使用,也是目前最流行的消息隊(duì)列系統(tǒng)之一,這篇文章主要介紹了kafka @KafkaListener 注解解讀,需要的朋友可以參考下
    2023-02-02
  • eclipse實(shí)現(xiàn)ElGamal數(shù)字簽名

    eclipse實(shí)現(xiàn)ElGamal數(shù)字簽名

    這篇文章主要為大家詳細(xì)介紹了eclipse實(shí)現(xiàn)ElGamal數(shù)字簽名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • 如何優(yōu)雅的處理Spring Boot異常信息詳解

    如何優(yōu)雅的處理Spring Boot異常信息詳解

    這篇文章主要給大家介紹了關(guān)于如何優(yōu)雅的處理Spring Boot異常信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringCloud-Nacos服務(wù)注冊(cè)與發(fā)現(xiàn)方式

    SpringCloud-Nacos服務(wù)注冊(cè)與發(fā)現(xiàn)方式

    這篇文章主要介紹了SpringCloud-Nacos服務(wù)注冊(cè)與發(fā)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評(píng)論

蓝山县| 丰原市| 吉首市| 安阳县| 泰宁县| 彭阳县| 古田县| 永靖县| 定陶县| 嘉鱼县| 聂荣县| 亚东县| 南和县| 清水河县| 绥德县| 呈贡县| 苍溪县| 特克斯县| 治多县| 博兴县| 清水河县| 堆龙德庆县| 长葛市| 马关县| 温州市| 仙居县| 宜春市| 绍兴市| 大宁县| 邵东县| 民勤县| 伊川县| 绥棱县| 濮阳县| 扶风县| 天镇县| 彭州市| 和龙市| 潜山县| 特克斯县| 芦溪县|