Spring 如何优雅的灵活的Http重试

news2025/2/24 4:00:21

1、背景说明

       在互联网时代, 不同系统之间大多数是通过http调用,调用过程中会超时、异常等过种问题。为了保证业务稳定,http 重试是常用方案。下面列举几种方案。

2、Http重试方案介绍

2.1 传统方案

  1、使用传统的递归调用,实现方法的代码截图如下:

还有更low的方法通过循环实现重试调用。

2、使用Http 自身的重试定义,要引入的jar 如下
  <dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpclient</artifactId>
  <version>4.4.1</version>
  </dependency>
  <dependency>
  <groupId>org.apache.httpcomponents</groupId>
  <artifactId>httpcore</artifactId>
  <version>4.4.1</version>
  </dependency>

这种方案需要自定义一个 HttpRequestRetryHandler,但是他一般是针对不同异常重试,代码截图如下,然后在产出httpClient 连接的时候把这个重试策略初始化进去。

2.2  使用灵活的框架

  1、 使用spring-retry框架实现,依赖jar 如下

要aop 的jar,因为retry 依赖此框架。 在Springboot 项目启动类上要加@EnableRetry(表示是否开启重试),代码通过注解方式实现,代码截图如下

注解说明如下

@Retryable表示 标注此注解的方法在发生异常时会进行重试,@Retryable属性有如下截图:

说明:interceptor表示interceptor的 bean 名称应用到 retryable(),默认为空,value表示可重试的异常类型。label表示 统计报告的唯一标签。如果没有提供,调用者可以选择忽略它,或者提供默认值。maxAttempts表示尝试的最大次数(包括第一次失败),默认为3次,backoff表示指定用于重试此操作的backof属性。默认为空。

@BackOff 注解如下截图

    

属性说明:

delay表示等待重试时间,如果不设置则默认使用 1000 milliseconds。

maxDelay表示最大重试等待时间。

multiplier表示用于计算下一个延迟延迟的乘数(大于0生效)

random表示随机等待时间。

2、使用guava-retrying 框架重试,依赖jar 如下,

代码截图如下

2.3、总结

相比传统的方式,使用框架让代码更加整洁、灵活,并且讲正常方法和重试方法进行解耦,并且可以设置超时时间、重试次数、间隔时间、监听结果、都是不错的框架。但是guava-retry在使用上更便捷,更灵活,能根据方法返回值来判断是否重试,而Spring-retry只能根据抛出的异常来进行重试。

   

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

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

相关文章

42.基于SpringBoot + Vue实现的前后端分离-服装销售平台管理系统(项目 + 论文)

项目介绍 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的交换和信息流通显得特别重要。因此&#xff0c;开发合适的服装销售平台成为企业必然要走的一步棋。开发合适的服…

让H5页面轻松打开第三方App,Xinstall助力实现无缝跳转

在移动互联网时代&#xff0c;H5页面因其跨平台、易传播的特性而被广泛应用&#xff0c;然而H5页面在打开第三方App时往往存在诸多不便。用户需要通过复杂的操作步骤才能实现跳转&#xff0c;这无疑降低了用户体验。为了解决这一难题&#xff0c;Xinstall应运而生&#xff0c;为…

达梦备份与恢复

达梦备份与恢复 基础环境 操作系统&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本&#xff1a;DM Database Server 64 V8 架构&#xff1a;单实例1 设置bak_path路径 --创建备份文件存放目录 su - dmdba mkdir -p /dm8/backup--修改dm.ini 文件…

【面试题】RocketMQ的工作流程?

RocketMQ是一种开源的分布式消息队列系统&#xff0c;它具有高吞吐量、低延迟和高可靠性的特点。下面是RocketMQ的简要工作流程&#xff1a; Producer&#xff08;生产者&#xff09;发送消息&#xff1a;消息的生产者将消息发送到RocketMQ。生产者将消息封装为一个消息对象&am…

DIY自己的AI

一、开源AI大语言模型 目前开源的AI大语言模型(LLM)已经非常的多了&#xff0c;以下是收集的一些LLM&#xff1a; LLaMA LLaMA&#xff08;Large Language Model Meta AI&#xff09;&#xff1a;LLaMA是由MetaAI的Facebook人工智能实验室&#xff08;FAIR&#xff09;发布的…

html5分步问卷调查表模板源码

文章目录 1.设计来源1.1 问卷调查11.2 问卷调查21.3 问卷调查31.4 问卷调查41.5 问卷调查51.6 问卷调查6 2.效果和源码2.1 完整效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/137454703 html5分…

2024/4/1—力扣—连续数列

代码实现&#xff1a; 思路&#xff1a;最大子数组和 解法一&#xff1a;动态规划 #define max(a, b) ((a) > (b) ? (a) : (b))int maxSubArray(int* nums, int numsSize) {if (numsSize 0) { // 特殊情况return 0;}int dp[numsSize];dp[0] nums[0];int result dp[0];fo…

【动态规划-状态压缩dp】【蓝桥杯备考训练】:毕业旅行问题、蒙德里安的梦想、最短Hamilton路径、国际象棋、小国王【已更新完成】

目录 1、毕业旅行问题&#xff08;今日头条2019笔试题&#xff09; 2、蒙德里安的梦想&#xff08;算法竞赛进阶指南&#xff09; 3、最短Hamilton路径&#xff08;《算法竞赛进阶指南》&模板&#xff09; 4、国际象棋&#xff08;第十二届蓝桥杯省赛第二场C A组/B组&#…

MySQL的基本查询

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;MySQL &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容介绍了mysql的基本查询部分的知识&#xff0c;包括Crea…

日期时间相关的类

分界线jdk8 jdk8之前和之后分别提供了一些日期和时间的类&#xff0c;推荐使用jdk8之后的日期和时间类 Date类型 这是一个jdk8之前的类型&#xff0c;其中有很多方法已经过时了&#xff0c;选取了一些没有过时的API //jdk1.8之前的日期 Date Date date new Date(); // 从1970年…

多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测

多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络…

白色磨砂质感html5页源码

白色磨砂质感html5页源码&#xff0c;简约的基础上加上了团队成员&#xff0c;自动打字特效音乐播放器存活时间 源码下载 https://www.qqmu.com/2980.html

实战搭建网易有道的QAnything(一) 前提准备工作

前言&#xff1a; 早上地铁上刷到了关于有道的QAnything的介绍&#xff0c;刚好也有搭建一个知识库的想法&#xff0c;既然有想法那就干起来&#xff0c;电脑的操作系统用的win11&#xff0c;显卡用了两块4060。 一、安装windows子系统 1. 开始-》运行-》控制面板 打开原始的控…

开启Java之旅——用Java实现简易的图书管理系统(24.4.7)

图书管理系统 一、设计思路 1、首先需要区分两类人&#xff0c;图书管理员和借书用户&#xff0c;不同的用户要展现不同的界面&#xff0c;利用继承和多态可以将其实现。 2、要将不同的操作封装起来&#xff0c;单独设计成为一个类&#xff0c;为了规范实现&#xff0c;需要…

【CicadaPlayer】demuxer_service中DASH的简单理解

DASH协议 dash 是属于demuxer模块的 MPEG-DASH是一种自适应比特率流技术,可根据实时网络状况实现动态自适应下载。和HLS, HDS技术类似, 都是把视频分割成一小段一小段, 通过HTTP协议进行传输,客户端得到之后进行播放;不同的是MPEG-DASH支持MPEG-2 TS、MP4(最新的HLS也支持…

【IPV6】--- IPV6过渡技术之6 over 4隧道配置

1. IPV4和IPV6有什么区别&#xff1f; 2. IPV6如何在设备上配置&#xff1f; 3. IPV4和IPV6如何跨协议实现通信&#xff1f; 1. IPV4和IPV6 --- IPV6技术 - IP协议第六版 - 128位二进制数 - 2^12843亿*43亿*43亿*43亿 --- IPV4技术 - IP协议第四版 - 192.1…

element-ui使用记录

element-ui的组件名就是类名 样式穿透&#xff08;用来修改没有类名的子组件样式&#xff09; 例如修改头部具名插槽的样式&#xff08;但是无法定位该元素&#xff09; 查看最后生成的html结构中对应的结构&#xff08;这里的头部有类名&#xff0c;可以直接对该类名进行样…

C#学习笔记9:winform上位机与西门子PLC网口通信_上篇

今日继续我的C#学习笔记&#xff0c;今日开始学习打开使用千兆网口来进行与西门子PLC的通信&#xff1a; 文章提供整体代码、解释、测试效果截图、整体测试工程下载&#xff1a; 主要包含的知识有&#xff1a;下载NuGet程序包、西门子PLC及通信协议、搭建虚拟的S7通信仿真环境…

Betaflight 4.5RC3 AT32F435遇到的一些“怪”现象

Betaflight 4.5RC3 AT32F435遇到的一些“怪”现象 1. 源由2. “怪”现象2.1 电机#4没有RPM转速2.2 遥控器通道10接收机测试失败2.3 OSD 异常2.4 磁力计数据无法获取 3. 参考资料 1. 源由 升级下固件&#xff0c;追下“时髦”&#xff0c;赶下“潮流”&#xff0c;本着“活着就…

【Linux ARM 裸机】开发环境搭建

1、Ubuntu 和 Windows 文件互传 使用过程中&#xff0c;要频繁进行 Ubuntu 和 Windows 的文件互传&#xff0c;需要使用 FTP 服务&#xff1b; 1.1、开启 Ubuntu 下的 FTP 服务 //安装 FTP 服务 sudo apt-get install vsftpd //修改配置文件 sudo vi /etc/vsftpd.conf//重启…