Spring Cloud: OpenFeign 超时重试机制

news2024/9/20 5:33:59

        超时重试是一种用于网络通信的常用策略,目的是在请求未能在规定时间内获得响应或响应超时的情况下,重新发送请求。具体来说,当发起请求后,如果在设定的时间内未能收到预期的响应,就会启动超时重试机制,重新发送该请求。超时重试的主要目标是提高请求的可靠性和稳定性,以应对网络不稳定、服务不可用、响应延迟等情况。

        简单来说,超时重试就像是给网络请求设置了一个"保底方案"。假设你在网上购物时提交了一个订单请求,但由于网络原因,这个请求没有及时得到响应。超时重试机制就会在一定时间内再次发送这个请求,直到成功或者达到最大重试次数为止。

        举个例子,想象一下你正在给朋友发信息,但发出去后没有收到“已读”回执,你可能会等一会儿再重新发送这条信息。超时重试机制就是这样一个过程,但它是自动完成的,不需要人工干预。这个机制能提高请求的成功率,确保在网络不稳定或者服务暂时不可用时,系统仍能保持较高的可靠性和稳定性。

        通过这种方式,即使网络出现短暂的问题,用户的请求也能在多次尝试后最终成功,大大提升了用户体验和系统的健壮性。

        在微服务架构中,服务之间通过网络进行通信,而网络环境往往具有复杂性和不稳定性。因此,在调用服务时可能会出现失败或超时的情况。为了解决这些问题,Spring Cloud OpenFeign 提供了超时重试机制。

OpenFeign 超时重试步骤

1. 设置OpenFeign超时时间 (设置完才能实现超时功能, 有了超时功能才能完成重试操作)

  • 请求最大连接时间
  • 读取时间

2. 进行重试操作.(重试功能)

  • 重试次数
  • 重试间隔时间
  • 最大间隔时间

前文示例回顾

以上文项目示例为例, 项目中有两个模块, 一个是生产者 provider, 一个是消费者 consumer.

生产者 provider 提供了 getnamebyid 服务, 该服务对于 consumer 来说是一个远程服务(多模块, 微服务), 也就是该接口是一个远程接口.

消费者 consumer 则使用 OpenFeign + Loadbalancer + Nacos 进行调用:

在 consumer 里面会有一个 service, 在 service 里面使用了 OpenFeign 调用了 nacos-discovery-demo 的服务, 在服务中请求了远程接口 /user/getnamebyid, 得到了一个响应结果, 然后对它进行展示.

OpenFeign 超时重试配置

OpenFeign 默认情况下是不会自动开启超时重试的,所以想要开启超时重试,需要通过以下 2 步来实现:

  1. 配置超时重试
  2. 覆盖 Retryer 对象

配置服务消费者超时时间

spring:
  application:
    name: nacos-consumer-demo
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos
        register-enabled: false
    openfeign:
      client:
        config:
          default:
            connect-timeout: 1000 # 连接超时时间
            read-timeout: 1000 # 读取超时时间
server:
  port: 8080

开启超时重试

在IoC容器注入Retry对象, 使用的时候new即可.

package org.example.consumer.config;

import feign.Retryer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RetryConfig {
    @Bean
    public Retryer retryer() {
        return new Retryer.Default(
                1000,       // 重试间隔时间
                1000,       // 最大重试间隔时间
                3           // 最大重试次数
        );     
    }
}

示例代码

在provider中加入, 使服务超时的代码:

在消费者中配置超时重试:

启动生产者与消费者, 然后访问 getnamebyid 接口, 可以看到超时异常:

自定义超时重试机制

自定义超时重试机制的实现分为以下两步:

  1. 自定义超时重试类(实现 Retryer 接口,并重写 continueOrPropagate 方法)
  2. 设置配置文件。

创建一个超时重传的类

实现 Retryer 接口并重写 continueOrPropagate 方法

package org.example.consumer.config;

import feign.RetryableException;
import feign.Retryer;

import java.time.LocalDateTime;

public class CustomRetryer implements Retryer {
    private final int maxAttempts;  // 最大尝试次数
    private final long backoff;  // 超时间隔时间
    int attempt;    // 当前尝试次数

    public CustomRetryer() {
        this.maxAttempts = 3;
        this.backoff = 1000L;
        this.attempt = 0;
    }

    @Override
    public void continueOrPropagate(RetryableException e) {
        if (attempt++ >= maxAttempts) {
            throw e;
        }
        long interval = this.backoff;
        System.out.println(LocalDateTime.now() + " | 执行一次重试: " + interval);
        try {
            Thread.sleep(interval * attempt);
        } catch (InterruptedException ex) {
            throw new RuntimeException(ex);
        }

    }

    @Override
    public Retryer clone() {
        return new CustomRetryer();
    }
}

将自定义类设置到配置文件中

将自定义超时重传类设置到配置文件 OpenFeign... retryer 属性中

就可以运行查看效果了.

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

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

相关文章

徒手绘制 Android 通用进度条

拖动条&#xff08;FlexSeekBar&#xff09;&#xff0c;在Android的各个地方都非常常用&#xff0c;本文旨在自研一套通用的进度条&#xff0c;非常适合车载App使用 样式如下&#xff1a; 使用示例 <!--默认用法--> <com.max.android.ui.seekbar.FlexSeekBarandroi…

python获取文件列表按照文件修改时间进行排序,默认按照文件名时间戳排序

python获取文件列表按照文件修改时间进行排序,默认按照文件名时间戳排序 1、流程 1、获取文件绝对路径下的所有文件 2、通过os.path.getmtime获取每个文件的修改时间,并与文件组成元组,方便后续排序 3、默认按照时间戳降序,否则按照按修改时间排序文件列表(从最晚到最早)…

Linux忘记密码重置root密码、重置普通用户密码

重启看到选项按e reboot 或 init 62、移动到Linux开头的行在末尾添加 rw init/bin/bash3、按下Ctrlx引导启动 mount -o remount,rw /输入命令回车更改密码,输入新密码&#xff0c;别用小键盘&#xff0c;容易出错 passwd输入两次校验&#xff0c;出现updated successfully就…

几何建模基础-样条曲线和样条曲面介绍

1.概念介绍 1.1 样条曲线的来源 样条的英语单词spline来源于可变形的样条工具&#xff0c;那是一种在造船和工程制图时用来画出光滑形状的工具&#xff1a;富有弹性的均匀细木条/金属条/有机玻璃条&#xff0c;它围绕着按指定位置放置的重物或者压铁做弹性弯曲&#xff0c;以…

SAPUI5基础知识12 - 应用程序描述符(manifest.json)

1. 背景 在SAPUI5中&#xff0c;manifest.json是一个配置文件&#xff0c;它包含了应用程序的所有配置信息。这个文件是SAPUI5应用程序的核心&#xff0c;它定义了应用程序的元数据&#xff0c;包括应用程序的名称、描述、版本、模型、路由等信息。 manifest.json的主要功能和…

如何使用Vue3创建在线三维模型展示?

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 代码相关的技术博客 代码应用场景介绍 本段代码使用 RoughJS 库在 HTML5 Canvas 上创建了手绘风格的图像&#xff0c;展示了 RoughJS 库的强大功能&#xff0c;可用于创建具有有机手绘外观的图形。 代码基本…

2024已过半,还没试过在vue3中使用ioc容器吗?

Vue3 已经非常强大和灵活了&#xff0c;为什么还要引入 IOC 容器呢&#xff1f;IOC 容器离不开 Class&#xff0c;那么我们就从 Class 谈起 Class的应用场景 一提起 Class&#xff0c;大家一定会想到这是 Vue 官方不再推荐的代码范式。其实&#xff0c;更确切的说&#xff0c…

基于Java+SpringMvc+Vue技术的实验室管理系统设计与实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

二次元转向SLG,B站游戏的破圈之困

文 | 螳螂观察 作者 | 夏至 2023年是B站游戏的滑铁卢&#xff0c;尽管这年B站的游戏营收还有40多亿&#xff0c;但相比去年大幅下降了20%&#xff0c;整整少了10亿&#xff0c;这是过去5年来的最大跌幅&#xff0c;也是陈睿接管B站游戏业务一年以来&#xff0c;在鼻子上碰的第…

[每周一更]-(第104期):Go中使用Makefile的经验

文章目录 1. 项目结构2. Makefile的基础知识什么是 Makefile 3. Go项目的Makefile示例4. 详细解释每个Makefile目标5. 使用Makefile执行常见任务 在Go项目中&#xff0c;使用Makefile可以简化和自动化常见的开发和部署任务&#xff0c;如编译、测试、格式化和清理。深入认识及实…

opencv 鱼眼图像的矫正(动态参数调整)

一&#xff1a;棋盘校准参数说明(内参) 棋盘校准的方法及代码很多&#xff0c;参见其他连接 1&#xff1a;内参矩阵 2&#xff1a;畸变系数 针对鱼眼相机此处是4个参数&#xff0c;在其校准代码中也可以知道&#xff0c;其通常的定义如下&#xff1a; data.camera_mat np.e…

Jenkins 强制杀job

有时候有的jenkins job运行时间太长&#xff0c;在jenkins界面点击x按钮进行abort&#xff0c;会失败&#xff1a; 这时候点击&#xff1a; “Click here to forcibly terminate running steps” 会进一步kill 任务&#xff0c;但是也还是有杀不掉的可能性。 终极武器是jenkin…

降Compose十八掌之『飞龙在天』| Layout

公众号「稀有猿诉」 原文链接 降Compose十八掌之『飞龙在天』| Layout 页面布局是GUI应用开发的核心&#xff0c;决定着一个UI具体如何实现。今天将延着路线图来练习『降Compose十八掌』的第二招式&#xff0c;学习一下如何使用Compose中的布局来构建页面。 基础骨架 基…

成长过程,摔倒不要紧,爬起来、改过、前进

无论何时何地&#xff0c;我们都有重头再来的能力&#xff0c;这份生生不息的力量来自天之灵根&#xff1b; 学习过程会有跌倒&#xff0c;这是很正常的节奏次序&#xff0c;不能掩盖自己的过失、自欺欺人&#xff0c;这不是过失&#xff0c;摔倒了就拍拍身上的灰尘&#xff…

3 个令人惊艳的 AI 开源工具,诞生了!

大家好&#xff0c;今天继续聊聊 AI 科技圈发生的那些事。分享几个最新好玩、实用的AI工具。更多最新技术&#xff0c;文末加入我们。 LivePortrait LivePortrait&#xff1a;一款可以轻松让一幅肖像栩栩如生的工具 它可以精准操控眼睛和嘴唇动作&#xff1a; 让静态照片变为…

关于在自行封装的组件库中(使用vue-class-component)使用Vue-i18n无法正常翻译的解决办法

文章目录 介绍背景现象1解决办法 现象2原因分析解决办法 最终方案 介绍 大家或多或少都用过别人封装的组件库&#xff0c;甚至有人或者公司内有自行封装的一些公用组件库&#xff0c;而国际化翻译现在已经是各大项目中必不可少的一个插件了&#xff0c;但组件库中使用 i18n 进…

AI视频创作一条龙!达摩院“寻光”平台炸场WAIC,突破可控编辑难题

卡奥斯智能交互引擎是卡奥斯基于海尔近40年工业生产经验积累和卡奥斯7年工业互联网平台建设的最佳实践&#xff0c;基于大语言模型和RAG技术&#xff0c;集合海量工业领域生态资源方优质产品和知识服务&#xff0c;旨在通过智能搜索、连续交互&#xff0c;实时生成个性化的内容…

基于Java+SpringMvc+Vue技术的实验室管理系统设计与实现(6000字以上论文参考)

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

正态、威布尔、指数分布、伽马分布、对数正态分布介绍

目录 正态、威布尔、指数分布、3.1 概念介绍概率密度函数&#xff08;PDF&#xff09;累积分布函数&#xff08;CDF&#xff09;性质应用 3.2 参数及绘图参数概率密度函数&#xff08;PDF&#xff09;累积分布函数&#xff08;CDF&#xff09;绘图图像解读 3.3 指数分布拟合代码…

Java面经知识点汇总版

Java面经知识点汇总版 算法 14. 最长公共前缀&#xff08;写出来即可&#xff09; Java 计算机基础 数据库 基础 SQL SELECT first_name, last_name, salary FROM employees WHERE department Sales AND salary > (SELECT AVG(salary)FROM employeesWHERE department Sal…