第三方 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-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
特点:适合微服务架构,支持 熔断、限流、重试 一体化
配置稍微复杂
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 接口重试实现方式有:
- 手写 for 循环(简单粗暴)
- spring retry(主流、优雅,推荐)
- feign + resilience4j(适合微服务)
- guava retryer(灵活轻量)
- mq 延迟重试(分布式 & 高可靠场景)
建议:业务系统用 spring retry / resilience4j,跨系统对接用 mq 延迟重试兜底。
到此这篇关于java实现第三方 http 接口重试实现方式的文章就介绍到这了,更多相关java 第三方http接口重试内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论