网易首页 > 网易号 > 正文 申请入驻

Spring Boot中如何优雅的重试调用第三方API?

0
分享至

1 引言

在实际的应用中,我们经常需要调用第三方API来获取数据或执行某些操作。然而,由于网络不稳定、第三方服务异常等原因,API调用可能会失败。为了提高系统的稳定性和可靠性,我们通常会考虑实现重试机制。

本文将深入探讨如何在Spring Boot项目中优雅地重试调用第三方API,并结合代码示例,展示具体实现方式。
2 重试机制的必要性

第三方API调用可能面临各种不可预测的问题,如网络超时、服务器故障等。为了应对这些问题,引入重试机制可以帮助我们:

  • 提高系统的稳定性:在面对临时性故障时,通过重试机制可以减轻对系统的影响,确保服务的可用性。

  • 降低因故障而导致的用户体验差:用户可能无法感知到一次短暂的故障,而重试机制可以在不干扰用户操作的情况下自动修复问题。

3 Spring Retry简介

Spring Retry是Spring框架提供的一个模块,它通过提供注解或编程方式的方式,帮助我们实现方法级别的重试机制。在Spring Boot中,可以很方便地集成并使用Spring Retry。


4 Spring Retry实现重试 4.1 添加依赖

首先,我们需要在pom.xml中添加Spring Retry的依赖:


org.springframework.retry
spring-retry

4.2 配置重试策略

在Spring Boot中,我们可以使用@Retryable注解来标记希望重试的方法,并配置相应的重试策略。另外,推荐公众号Java精选,回复java面试,获取在线面试资料,支持随时随地刷题。

4.2.1 代码示例import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;

@Service
public class ThirdPartyService {

@Retryable(
value = { RestClientException.class },
maxAttempts = 3,
backoff = @Backoff(delay = 1000, multiplier = 2)
)
public String callThirdPartyApi() {
// 调用第三方API的逻辑
// ...
}
}

在上述示例中,@Retryable注解标记了callThirdPartyApi方法,指定了当发生RestClientException异常时进行重试。maxAttempts指定最大重试次数,backoff指定了重试间隔的初始延迟和延迟倍数。

4.3 降级处理

在实际应用中,除了重试,我们可能还希望在多次重试失败后执行降级操作,以避免一直等待不确定的恢复时间。

4.3.1 代码示例import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;

@Service
public class ThirdPartyService {

@Retryable(
value = { RestClientException.class },
maxAttempts = 3,
backoff = @Backoff(delay = 1000, multiplier = 2)
)
public String callThirdPartyApi() {
// 调用第三方API的逻辑
// ...
}

@Recover
public String fallback() {
// 降级处理逻辑
// ...
}
}

在上述示例中,@Recover注解标记了fallback方法,当callThirdPartyApi方法的重试次数达到上限时,将执行fallback方法中的降级逻辑。

5 异步重试

有时候,我们可能希望在异步任务中实现重试机制。Spring Retry同样提供了异步的支持。

5.1 异步方法的重试 5.1.1 代码示例import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;

@Service
public class AsyncThirdPartyService {

@Async
@Retryable(
value = { RestClientException.class },
maxAttempts = 3,
backoff = @Backoff(delay = 1000, multiplier = 2)
)
public CompletableFuture callAsyncThirdPartyApi() {
// 异步调用第三方API的逻辑
// ...
}
}

在上述示例中,通过@Async注解表示callAsyncThirdPartyApi方法是异步的,同时使用@Retryable配置了异步方法的重试策略。

5.2 异步方法的降级处理 5.2.1 代码示例import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;

@Service
public class AsyncThirdPartyService {

@Async
@Retryable(
value = { RestClientException.class },
maxAttempts = 3,
backoff = @Backoff(delay = 1000, multiplier = 2)
)
public CompletableFuture callAsyncThirdPartyApi() {
// 异步调用第三方API的逻辑
// ...
}

@Recover
public CompletableFuture fallback() {
// 异步降级处理逻辑
// ...
}
}

在上述示例中,使用@Recover标记的fallback方法同样支持异步,以处理异步方法的降级逻辑。

6 异常分类与重试

在实际应用中,我们可能会遇到不同类型的异常,有些异常是可以通过重试来解决的,而有些异常则需要特殊处理。Spring Retry支持通过include和exclude属性来指定要进行重试的异常类型和要排除的异常类型。

6.1 重试指定类型的异常 6.1.1 代码示例import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;

@Service
public class ThirdPartyService {

@Retryable(
value = { RestClientException.class, TimeoutException.class },
maxAttempts = 3,
backoff = @Backoff(delay = 1000, multiplier = 2)
)
public String callThirdPartyApi() {
// 调用第三方API的逻辑
// ...
}
}

在上述示例中,callThirdPartyApi方法会在发生RestClientExceptionTimeoutException异常时进行重试。

6.2 排除指定类型的异常 6.2.1 代码示例import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;

@Service
public class ThirdPartyService {

@Retryable(
value = { RestClientException.class },
maxAttempts = 3,
backoff = @Backoff(delay = 1000, multiplier = 2),
exclude = { TimeoutException.class }
)
public String callThirdPartyApi() {
// 调用第三方API的逻辑
// ...
}
}

在上述示例中,callThirdPartyApi方法会在发生RestClientException异常时进行重试,但排除了TimeoutException异常。

7 拓展

除了重试机制外,熔断机制也是一种常见的容错处理手段。Hystrix是一款流行的断路器实现库,可以与Spring Boot集成,用于实现熔断机制。

推荐程序员摸鱼地址: https://www.yoodb.com/slack-off/home.html
7.1 添加依赖

在pom.xml中添加Hystrix的依赖:


org.springframework.cloud
spring-cloud-starter-netflix-hystrix

7.2 配置启用Hystrix

在Spring Boot的主类上添加@EnableHystrix注解:

@SpringBootApplication
@EnableHystrix
public class YourApplication {
public static void main(String[] args) {
SpringApplication.run(YourApplication.class, args);

7.3 使用Hystrix实现熔断 7.3.1 代码示例import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;

@Service
public class ThirdPartyService {

@HystrixCommand(fallbackMethod = "fallback")
public String callThirdPartyApi() {
// 调用第三方API的逻辑
// ...
}

public String fallback() {
// 熔断时的降级逻辑
// ...
}
}

在上述示例中,通过@HystrixCommand注解标记了callThirdPartyApi方法,指定了熔断时执行的降级方法fallback。

8 性能分析与测试

在引入重试机制后,我们需要对系统的性能进行全面的测试和分析,以确保重试机制的引入不会影响系统的整体性能。可以通过压力测试工具模拟高并发的情况,观察系统在异常情况下的表现。

9 总结

在Spring Boot项目中,通过集成Spring Retry模块,我们可以优雅地实现对第三方API调用的重试机制。通过@Retryable注解,我们能够很方便地在方法级别上添加重试策略。

同时,异步方法和异常类型的支持使得我们能够更灵活地应对不同的业务场景。此外,我们还介绍了通过断路器(Hystrix)实现熔断机制的拓展方式。

在实际应用中,需要根据业务场景和需求综合考虑重试机制和熔断机制的使用。通过这些容错处理手段,我们能够提高系统的稳定性和可靠性,保障服务的正常运行。

作者:IT·陈寒 https://blog.csdn.net/qq_43546721/article/details/134848416

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
走马上任!孙颖莎、王楚钦获重要任命!新职务曝光!同款T恤引人注目!

走马上任!孙颖莎、王楚钦获重要任命!新职务曝光!同款T恤引人注目!

好乒乓
2024-06-16 10:30:42
养老金上调基本正式确定,1950和1960出生的人,上调会有差异吗?

养老金上调基本正式确定,1950和1960出生的人,上调会有差异吗?

奇名呀
2024-06-11 09:02:33
上汽回应:将采取一切必要措施

上汽回应:将采取一切必要措施

观察者网
2024-06-13 14:19:05
黄一鸣再晒女儿视频,嘴巴鼻子超像王健林,衣服起球居住环境曝光

黄一鸣再晒女儿视频,嘴巴鼻子超像王健林,衣服起球居住环境曝光

缘浅娱深
2024-06-14 17:36:56
罕见省部级高干在中央党报公开表达“不满”:困惑很久,不吐不快

罕见省部级高干在中央党报公开表达“不满”:困惑很久,不吐不快

华人星光
2024-06-07 19:20:09
“商砼”的“砼”字不读quán,也不读shuān,那它的正确读音是?

“商砼”的“砼”字不读quán,也不读shuān,那它的正确读音是?

迷局科普
2024-06-14 11:29:09
4年2.21亿,再见快船!荣誉不要了,只要钱,哈登成了最大输家

4年2.21亿,再见快船!荣誉不要了,只要钱,哈登成了最大输家

祝晓塬
2024-06-16 03:56:47
梅西拒绝沙特内幕:无视14亿天价合同!背后原因曝光!对方惊了!

梅西拒绝沙特内幕:无视14亿天价合同!背后原因曝光!对方惊了!

风过乡
2024-06-16 07:13:26
一男子怀疑妻子出轨,特意带她出国体验异域按摩,结果双方沦陷

一男子怀疑妻子出轨,特意带她出国体验异域按摩,结果双方沦陷

亲爱的落落
2024-05-07 16:58:09
凯特王妃重返公众视野,与王室成员的聊天被唇语解读

凯特王妃重返公众视野,与王室成员的聊天被唇语解读

土澳的故事
2024-06-15 23:09:09
笑不活了!清华学霸爷爷送孙女高考接受采访,我却笑死在了评论区

笑不活了!清华学霸爷爷送孙女高考接受采访,我却笑死在了评论区

天气观察站
2024-06-12 15:03:28
伊朗军工立下大功,真主党用山寨导弹,一把端了以色列防空网根基

伊朗军工立下大功,真主党用山寨导弹,一把端了以色列防空网根基

青年的背包
2024-06-14 18:12:46
黑龙江车祸惨烈!5人遇难,4名竟是刚高考完的学生,令人心痛。

黑龙江车祸惨烈!5人遇难,4名竟是刚高考完的学生,令人心痛。

小毅讲历史
2024-06-16 06:00:27
新射雕英雄传:定档6月17日,五绝演员官宣,王重阳气质绝了!

新射雕英雄传:定档6月17日,五绝演员官宣,王重阳气质绝了!

综艺拼盘汇
2024-06-14 17:29:21
日本制裁中企?中方发出警告不到一天, 岸田就开始定制裁中企名单

日本制裁中企?中方发出警告不到一天, 岸田就开始定制裁中企名单

前沿天地
2024-06-16 11:20:13
杰伦-格林与大17岁的女友逛街还推着刚满月的小女儿

杰伦-格林与大17岁的女友逛街还推着刚满月的小女儿

直播吧
2024-06-16 10:08:23
国米成主角!2-1逆转世界第66,意大利想卫冕难度大,下1场见真章

国米成主角!2-1逆转世界第66,意大利想卫冕难度大,下1场见真章

球场的看客
2024-06-16 12:29:04
国足18强赛分档确定,避开日韩跟两支送分童子一组,出线指日可待

国足18强赛分档确定,避开日韩跟两支送分童子一组,出线指日可待

罗掌柜体育
2024-06-15 19:30:47
坐滩舰终于迎来大结局,菲驻军恐提前撤离,中方发话:允许离开!

坐滩舰终于迎来大结局,菲驻军恐提前撤离,中方发话:允许离开!

绝对军评
2024-06-13 07:53:45
积极康复!王大雷骑公路自行车做训练,2小时19分骑行50.96km

积极康复!王大雷骑公路自行车做训练,2小时19分骑行50.96km

直播吧
2024-06-15 15:50:36
2024-06-16 13:00:49
Java精选
Java精选
一场永远也演不完的戏
1551文章数 3855关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

媒体:普京开出的停火条件有重大变化 已亮出战略底牌

头条要闻

媒体:普京开出的停火条件有重大变化 已亮出战略底牌

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

教育
家居
旅游
艺术
军事航空

教育要闻

高考结束不代表万事大吉,考生别着急丢准考证,这8个用途需了解

家居要闻

空谷来音 朴素留白的侘寂之美

旅游要闻

@毕业生,江苏这些景区可享免票或优惠

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

军事要闻

普京提停火和谈条件 美防长迅速回应

无障碍浏览 进入关怀版