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

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

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

第三方 HTTP 接口重試的編碼實現(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ù)退避、異常分類,適合小項目

2. 使用 Spring Retry(推薦)

Spring 提供的 注解驅(qū)動重試,非常適合調(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)入降級邏輯: " + 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ī)抖動)
需要額外依賴 Guava Retryer

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

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

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

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

總結(jié)

第三方 HTTP 接口重試實現(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)對接用 MQ 延遲重試兜底。

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

相關(guān)文章

  • SpringBoot項目Docker部署三種方式

    SpringBoot項目Docker部署三種方式

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

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

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

    maven中的scope與systemPath用法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論

阳原县| 云安县| 隆尧县| 玛纳斯县| 城口县| 正镶白旗| 西和县| 白玉县| 隆化县| 东台市| 舟山市| 十堰市| 凌云县| 越西县| 惠州市| 班玛县| 大姚县| 黄平县| 泸溪县| 龙江县| 无极县| 平安县| 共和县| 田东县| 二连浩特市| 乐都县| 武定县| 通海县| 苏尼特右旗| 根河市| 临城县| 北宁市| 隆安县| 久治县| 河间市| 梧州市| 右玉县| 金乡县| 沙洋县| 双江| 龙井市|