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

这篇具有很好参考价值的文章主要介绍了SpringBoot中 如何优雅的 重试调用 第三方API?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

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

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

重试机制的必要性

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

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

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

Spring Retry简介

Spring Retry是Spring框架提供的一个模块,它通过提供注解或编程方式的方式,帮助我们实现方法级别的重试机制。在Spring Boot中,可以很方便地集成并使用Spring Retry。
SpringBoot中 如何优雅的 重试调用 第三方API?,java,Springboot,spring boot,后端,java

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方法中的降级逻辑。

异步重试

有时候,我们可能希望在异步任务中实现重试机制。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方法同样支持异步,以处理异步方法的降级逻辑。

异常分类与重试

在实际应用中,我们可能会遇到不同类型的异常,有些异常是可以通过重试来解决的,而有些异常则需要特殊处理。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方法会在发生RestClientException或TimeoutException异常时进行重试。

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异常。

拓展:使用断路器实现熔断机制

除了重试机制外,熔断机制也是一种常见的容错处理手段。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。

性能分析与测试

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

总结

在Spring Boot项目中,通过集成Spring Retry模块,我们可以优雅地实现对第三方API调用的重试机制。通过@Retryable注解,我们能够很方便地在方法级别上添加重试策略。同时,异步方法和异常类型的支持使得我们能够更灵活地应对不同的业务场景。此外,我们还介绍了通过断路器(Hystrix)实现熔断机制的拓展方式。

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

转载于https://blog.csdn.net/qq_43546721/article/details/134848416文章来源地址https://www.toymoban.com/news/detail-813122.html

到了这里,关于SpringBoot中 如何优雅的 重试调用 第三方API?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Springboot系列】Springboot系列-调用第三方接口的五种方式汇总,代码实例

    在开发中,经常需要调用第三方接口或者其他的应用接口来完成业务需求。今天分享下Spring Boot中调用第三方接口的多种方式。 1、使用OpenFeign进行调用(推荐) 2、使用原始httpClient请求 3、使用RestTemplate方法 4、使用hutool.httputil 5、使用OkHttp3 Feign是一个声明式的Web Service客户端

    2024年02月11日
    浏览(48)
  • Springboot实现上传文件,并实现调用第三方接口post请求多文件上传文件

    项目过程中,经常会有和第三方接口打交道的过程,今天实现调用第三方上传文件的接口!! 通常拿到第三方的接口文档的时候,不是第一时间先写代码,而是详细阅读接口文档。若接口需要第三方提供的基本参数,例如signkey, secrect等,也可以是其他的,查看文档里是否提

    2024年02月16日
    浏览(46)
  • 在yolov5的detect中我该如何调用第三方摄像头?

    要在 YOLOv5 的 detect 中调用第三方摄像头,你可以使用 OpenCV 库中的 VideoCapture 类来读取摄像头的视频流。 你可以这样做: 首先,安装 OpenCV 库。 然后,在你的代码中包含以下头文件: 接下来,创建一个 VideoCapture 对象,用于获取摄像头的视频流: 然后,打开摄像头,并检查

    2024年02月12日
    浏览(45)
  • Forest-声明式HTTP客户端框架-集成到SpringBoot实现调用第三方restful api并实现接口数据转换

    声明式HTTP客户端API框架,让Java发送HTTP/HTTPS请求不再难。它比OkHttp和HttpClient更高层, 是封装调用第三方restful api client接口的好帮手,是retrofit和feign之外另一个选择。 通过在接口上声明注解的方式配置HTTP请求接口。 官网: Forest   代码地址: forest: 声明式HTTP客户端API框架,让

    2024年02月04日
    浏览(111)
  • 如何通过python写接口自动化脚本对一个需要调用第三方支付的报名流程进行测试?

    对于需要调用第三方支付的报名流程进行接口自动化测试,可以通过以下步骤来编写Python代码: 1. 确认API需求 首先,需要确认报名流程的API需求和预期功能。这涉及到对业务需求的理解和API设计的分析。 2. 安装依赖库 在Python程序中,需要安装requests库(用于发送HTTP请求)和

    2024年02月10日
    浏览(68)
  • AndroidStudio调用第三方so库

    背景         最近公司设备换了新的触摸屏(为I2C接口),该触摸屏有个app,app中可以显示触摸屏固件的版本。我需要做的是在自己的app中读取到触摸屏固件版本。         反编译了apk,得到了源码,发现对方app是通过jni调用so库的方式获取到的触摸屏固件版本。所以

    2024年04月26日
    浏览(36)
  • 仅仅是调用第三方接口那么简单吗?

    最近有个项目需要本地处理之后,然后调用第三方接口,本来开始觉得很简单得事情,不就是调用第三方接口吗?但是却一波三折。 首先有了下面的第一版的设计。 这个设计很简单,也是最容易想到的。主要有下面几步 1、本地处理; 2、调用第三方接口; 3、本地日志打印

    2024年02月06日
    浏览(63)
  • 我调用第三方接口遇到的13大坑

    在实际工作中,我们经常需要在项目中调用第三方API接口,获取数据,或者上报数据,进行数据交换和通信。 那么,调用第三方API接口会遇到哪些问题?如何解决这些问题呢? 这篇文章就跟大家一起聊聊第三方API接口的话题,希望对你会有所帮助。   一般我们在第一次对接

    2023年04月16日
    浏览(56)
  • uniapp小程序调用第三方地图导航

    效果    

    2024年02月15日
    浏览(36)
  • C#--调用Python(包含第三方库)

    参考链接 可以很好的支持第三方库。 推荐这个,经本人验证这个很好用。 后文 2. 详细使用。 如果使用第三方库就放弃这个吧,真的用不了,使用时报各种错。 如果只是标准库,可以用这个。 只需要在 nuget 里装上 IronPython 和 IronPython.StdLib 即可。 使用参考链接 1.3.1 示例演

    2024年02月07日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包