Java實(shí)現(xiàn)第三方 HTTP 接口重試實(shí)現(xiàn)方式
第三方 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-retry 和 spring-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)方式有:
- 手寫 for 循環(huán)(簡單粗暴)
- Spring Retry(主流、優(yōu)雅,推薦)
- Feign + Resilience4j(適合微服務(wù))
- Guava Retryer(靈活輕量)
- 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部署三種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08
MyBatis?在使用上的注意事項(xiàng)及其辨析(最新最全整理)
這篇文章主要介紹了MyBatis的在使用上的注意事項(xiàng)及其辨析,本文內(nèi)容比較長,是小編用心給大家整理的,圖文實(shí)例代碼相結(jié)合給大家講解的非常詳細(xì),需要的朋友參考下吧2024-06-06
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
spring kafka框架中@KafkaListener 注解解讀和使用案例
Kafka 目前主要作為一個(gè)分布式的發(fā)布訂閱式的消息系統(tǒng)使用,也是目前最流行的消息隊(duì)列系統(tǒng)之一,這篇文章主要介紹了kafka @KafkaListener 注解解讀,需要的朋友可以參考下2023-02-02
eclipse實(shí)現(xiàn)ElGamal數(shù)字簽名
這篇文章主要為大家詳細(xì)介紹了eclipse實(shí)現(xiàn)ElGamal數(shù)字簽名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
SpringCloud-Nacos服務(wù)注冊(cè)與發(fā)現(xiàn)方式
這篇文章主要介紹了SpringCloud-Nacos服務(wù)注冊(cè)與發(fā)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

