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

news2024/11/27 8:43:08

文章目录

    • 1. 引言
    • 2. 重试机制的必要性
    • 3. Spring Retry简介
    • 4. Spring Boot中使用Spring Retry实现重试
      • 4.1 添加依赖
      • 4.2 配置重试策略
        • 4.2.1 代码示例
      • 4.3 降级处理
        • 4.3.1 代码示例
    • 5. 异步重试
      • 5.1 异步方法的重试
        • 5.1.1 代码示例
      • 5.2 异步方法的降级处理
        • 5.2.1 代码示例
    • 6. 异常分类与重试
      • 6.1 重试指定类型的异常
        • 6.1.1 代码示例
      • 6.2 排除指定类型的异常
        • 6.2.1 代码示例
    • 7. 拓展:使用断路器实现熔断机制
      • 7.1 添加依赖
      • 7.2 配置启用Hystrix
      • 7.3 使用Hystrix实现熔断
        • 7.3.1 代码示例
    • 8. 性能分析与测试
    • 9. 总结

在这里插入图片描述

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


  • ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹
  • ✨博客主页:IT·陈寒的博客
  • 🎈该系列文章专栏:架构设计
  • 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习
  • 🍹文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️

1. 引言

在实际的应用中,我们经常需要调用第三方API来获取数据或执行某些操作。然而,由于网络不稳定、第三方服务异常等原因,API调用可能会失败。为了提高系统的稳定性和可靠性,我们通常会考虑实现重试机制。本文将深入探讨如何在Spring Boot项目中优雅地重试调用第三方API,并结合代码示例,展示具体实现方式。

2. 重试机制的必要性

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

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

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

3. Spring Retry简介

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

在这里插入图片描述

4. Spring Boot中使用Spring Retry实现重试

4.1 添加依赖

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

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>

4.2 配置重试策略

在Spring Boot中,我们可以使用@Retryable注解来标记希望重试的方法,并配置相应的重试策略。

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<String> 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<String> callAsyncThirdPartyApi() {
        // 异步调用第三方API的逻辑
        // ...
    }

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

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

6. 异常分类与重试

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

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集成,用于实现熔断机制。

7.1 添加依赖

pom.xml中添加Hystrix的依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

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)实现熔断机制的拓展方式。

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


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

  • 【Java面试技巧】Java面试八股文 - 掌握面试必备知识(目录篇)
  • 【Java学习路线】2023年完整版Java学习路线图
  • 【AIGC人工智能】Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么
  • 【Java实战项目】SpringBoot+SSM实战:打造高效便捷的企业级Java外卖订购系统
  • 【数据结构学习】从零起步:学习数据结构的完整路径

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1291695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新能源工业园污水处理有哪些工艺设备

新能源工业园是推动可持续发展的重要一环&#xff0c;而污水处理是确保工业园区环境健康的关键步骤。在新能源工业园的污水处理过程中&#xff0c;常用的工艺设备主要包括&#xff1a; 1. 预处理设备&#xff1a;预处理设备主要用于去除进入污水处理系统的大颗粒物质&#xff0…

技术培训邀请函|云时代数据安全建设和实践

在数字化变革时代&#xff0c;云计算渗透到各个行业和领域中&#xff0c;赋能业务创新发展&#xff0c;但机遇与挑战并存。数据作为战略性资产和核心生产要素&#xff0c;在混合多云环境面临着日益严峻的安全风险和越来越多的合规要求。如何实现有效的数据安全保护&#xff0c;…

在 Windows 桌面的redis中远程连接到 VMware 中运行的 Linux 上的 Redis

先修改一下docker容器中的redis(一会连上之后看效果) 我使用的是VMware的虚拟机 选择的网络设置为桥接模式 查到虚拟机独立的ip是如下 允许 Linux 虚拟机上的 Redis 监听外部连接&#xff1a; 打开 Linux 虚拟机上的 Redis 配置文件。在大多数系统上&#xff0c;配置文件位于…

利用TCP通信实现文件传输和通信

前言 我们上一章已经熟悉了理论知识&#xff0c;这一章来练习一下 1.实现文件的传输 1.1 客户端 dir_client.c #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/types.h> #include …

数据分析基础之《matplotlib(3)—散点图》

一、常见图形种类及意义 1、matplotlib能够绘制折线图、散点图、柱状图、直方图、饼图。我们需要知道不同的统计图的意义&#xff0c;以此来决定选择哪种统计图来呈现我们的数据 2、折线图plot 说明&#xff1a;以折线的上升或下降来表示统计数量的增减变化的统计图 特点&…

Python实现FA萤火虫优化算法优化随机森林分类模型(RandomForestClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

pandas数据转换成ndarray数组

Pandas 和 NumPy 被认为是科学计算与机器学习中必不可少的库&#xff0c;因为它们具有直观的语法和高性能的矩阵计算能力。下面对 Pandas 与 NumPy 进行简单的总结&#xff0c;如下表所示&#xff1a; 要将Pandas DataFrame转换为ndarray数组&#xff0c;您可以使用.values属…

统计centos系统哪一个进程打开文件描述符

一&#xff1a;找出前10进程打开的描述符 # find /proc/ -print|grep -P /proc/\d/fd|awk -F/ {print $3}|uniq -c|sort -rn |awk {print "进程 "$2" 打开 "$1" 个文件描述符"}|head 二&#xff1a;通过进程id找出对应的进程运行的程序。 # ps…

tensorflow模型的加载及保存,以及在C++端的部署

一、模型保存和加载 参考文章:TensorFlow2.0 —— 模型保存与加载 方法一、 仅保存模型权重(model.save_weights) 有两种保存模型权重的方法,一种是保存.h5形式。model.save_weights("adasd.h5") # 模型权重保存 model.load_weights("adasd.h5") # 模型…

外贸新人警惕:做外贸要注意的6个风险

近期外贸新人非常多&#xff0c;在这里给大家安利一波出口业务的注意事项。 一般情况下&#xff0c;风险主要有以下六种情况&#xff1a; 1、出货规格、日期与合同规定不符造成的收汇分险 出口方未按合同或信用证规定交货。 一是生产误工&#xff0c;造成晚交货&#xff1b; …

深入理解数据在内存中是如何存储的,位移操作符如何使用(能看懂文字就能明白系列)文章超长,慢慢品尝

系列文章目录 C语言笔记专栏 能看懂文字就能明白系列 &#x1f31f; 个人主页&#xff1a;古德猫宁- &#x1f308; 信念如阳光&#xff0c;照亮前行的每一步 文章目录 系列文章目录&#x1f308; *信念如阳光&#xff0c;照亮前行的每一步* 前言引子一、2进制和进制转化为什么…

洗鞋机行业分析:2023年市场发展前景及消费现状

随着消费主力的转移&#xff0c;年轻群体在消费中的话语权和影响力越来越大&#xff0c;“精致懒”正在成为潮流。洗鞋机作为消费升级时代的产物&#xff0c;自诞生以来&#xff0c;经过十几年的发展&#xff0c;逐渐被年轻消费者熟知&#xff0c;洗鞋机品牌阵营和产品种类也变…

做外贸和你想的不一样

半夜突然想起来以前刚毕业入职的时候&#xff0c;那会在网上投简历基本上都是招聘外贸业务员的&#xff0c;可能那个时段正是外贸的高潮期&#xff0c;阿里那会还可以免费注册&#xff0c;免费试用开发客户。 然后我们同学们结队的一起去找工作&#xff0c;一般是有一个同学收…

万兆单模OSX010000:企业高速网络传输可靠解决方案

随着信息技术的不断发展&#xff0c;企业对于高速网络传输的需求不断增加。网络设备需要不断更新换代&#xff0c;以满足更高速、更远距离的传输要求。万兆单模光模块OSX010000是华为旗下的基于光纤传输的万兆单模光模块&#xff0c;适用于长距离的数据传输。本文将介绍什么是万…

python获取js data.now同款时间戳

import requestsimport time from datetime import datetimecu_t datetime.now() se cu_t.timestamp()*1000 se int(se) print(se)#cur_time time.time()*1000 #seconds int(cur_time) #print(seconds)

矩阵处理—旋转正方形矩阵

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 旋转正方形矩阵1 题目描述2 解决思路3 代码实现 &#x1f48e;总结 旋转正方形矩阵 1 题目描述 有一个n*n的矩阵&#xff0c;现在把整个矩阵顺时针旋转90&#xff0c;如图&#xff1a; 2 解决思路 设置四个指针&…

2023人工智能和市场营销的融合报告:创造性合作的新时代需要新的原则

今天分享的人工智能系列深度研究报告&#xff1a;《2023人工智能和市场营销的融合报告&#xff1a;创造性合作的新时代需要新的原则》。 &#xff08;报告出品方&#xff1a;M&CSAATCHITHINKS&#xff09; 报告共计&#xff1a;11页 生成型人工智能的兴起和重要性 生成式…

vue的data

类型&#xff1a;Object | Function 限制&#xff1a;组件的定义只接受 function。 详细&#xff1a; Vue 实例的数据对象。Vue 会递归地把 data 的 property 转换为 getter/setter&#xff0c;从而让 data 的 property 能够响应数据变化。对象必须是纯粹的对象 (含有零个或多个…

localhost工具:本地代码的远程之路 | 京东云技术团队

在日常的开发过程中&#xff0c;本地代码远程调试一直是最理想的开发状态。本文通过介绍京东集团内开发的一个轻量简单的小工具”localhost”&#xff0c;从多角度的方案思考&#xff0c;到原理介绍&#xff0c;到最终的方案落地&#xff0c;在开发阶段发现问题&#xff0c;解决…

短视频账号剪辑矩阵+无人直播系统源头开发

抖去推爆款视频生成器&#xff0c;通过短视频矩阵、无人直播&#xff0c;文案引流等&#xff0c;打造实体商家员工矩阵、用户矩阵、直播矩阵&#xff0c;辅助商家品牌曝光&#xff0c;团购转化等多功能赋能商家拓客引流。 短视频矩阵通俗来讲就是批量剪辑视频和批量发布视频&am…