OpenFegin

news2024/12/26 20:51:24

文章目录

  • 一、OpenFegin是什么?
  • 二、基本使用
  • 三、超时重试机制
  • 4.自定义超时重传机制
  • 五、底层实现

一、OpenFegin是什么?

OpenFeign的全称为Spring Cloud OpenFeign(下文简称OpenFeign),是Spring Cloud团队开发的一款基于
Feign的框架,声明式Web服务客户端。

而feign是Netflix开源的一个声明式的Web服务客户端,它简化了基于HTTP的服务调用,使得服务间的通信变
得更加简单和灵活。Fign通过定义接口、注解和动态代理等方式,将服务调用的过程封装起来,开发者只需要
定义服务接口,而无需关心底层的HTTP请求和序列化等细节。

OpenFeign在Feign的基础上提供了以下增强和扩展功能:
1.更好的集成Spring Cloud组件:OpenFeign与Spring Cloud其他组件(如服务发现、负载均衡等)紧密集
成,可以无缝地与其他Spring Cloud组件一起使用。
2.支持@FeignClient注解:OpenFeign入了@FeignClient注解作为Feign客户端的标识,可以方便地定义
和使用远程服务的声明式接口。
3.错误处理改进:OpenFeign对异常的处理做了增强,提供了更好的错误信息和异常处理机制,使得开发者可以
更方便地进行错误处理。例如OpenFeign提供的错误解码器(DefaultErrorDecoder)和回退策略(当服务端返
回错误响应或请求失败时,OpenFeign会调用回退策略中的逻辑,提供一个默认的处理结果)。
4.更丰富的配置项:OpenFeign提供了丰富的配置选项,可以对Feign客户端的行为进行灵活的配置,例如超时
设置、重试策略等。

二、基本使用

基本使用在之前的nacos注册中心时已经演示 可以点击观看nacos注册中心

三、超时重试机制

在微服务架构中,服务之间是通过网络进行通信的,而网络是非常复杂性和不稳定的,所以在调用服务时可能会失
败或超时,那么在这种情况下,我们就需要给OpenFeign配置超时重试机制了。

什么是超时重试?
答:超时重试是一种在网络通信中常用的策略,用于处理请求在一定时间内未能得到响应或得到超时响应的情
况。当发起请求后,如果在规定的时间内没有得到预期的响应,就会触发超时重试机制,重新发送请求。
超时重试的主要目的是提高请求的可靠性和稳定性,以应对网络不稳定、服务不可用、响应延迟等不确定因素。

OpenFeign默认情况下是不会自动开启超时重试的,所以想要开启超时重试,需要通过以下2步来实现:
1.配置超时重试
2.覆盖Retryer对象

    openfeign:
      client:
        config:
          default:
            connect-timeout: 1000 # 连接超时时间
            read-timeout: 1000 # 读取超时时间
@Configuration // 将当前对象存储在 IoC 容器
public class RetryerConfig {
    @Bean
    public Retryer retryer(){
        return new Retryer.Default(1000,1000,3);
    }
}

而这里的1000,1000,3 分别代表重试间隔时间,最大重试间隔时间,最大重试次数

    @RequestMapping("/getnamebyid")
    public String getNameById(Integer id) throws InterruptedException {
        System.out.println("-------------------- Do Provider getNameById method."
                + LocalDateTime.now());
        Thread.sleep(1500);
        return "provider-name-" + id +
                " | port:" + context.getWebServer().getPort();
    }

设置的读取超时时间为1秒 我们手动让线程休眠1.5秒那么就会触发超时重传机制
在这里插入图片描述
结果是符合预期的

4.自定义超时重传机制

自定义超时重试机制的实现分为以下两步:
1.自定义超时重试类(实现Retryer接口,并重写continueOrPropagate方法)。
2.设置配置文件。

常见的超时重试策略有以下三种:
1.固定间隔重试:每次重试之间的时间间隔固定不变,例如每次重试之间相隔1秒。
2.指数重试:每次重试之间的时间间隔按指数递增。例如,初始间隔为1秒,每次重试后加倍,即第一次1秒,
第二次2秒,第三次4秒,以此类推。
3.随机间隔重试:每次重试之间的时间间隔是随机的,通过引入随机性来防止多个失败请求同时发生。例如,每
次重试的时间间隔在一定范围内随机选择。


/**
 * 自定义超时重传类
 */
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();
    }
}

在这里插入图片描述
可以看到重试时间符合我们的预期

spring:
  application:
    name: nacos-consumer-demo
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos
        register-enabled: false # 消费者(不需要将此服务注册到nacos)
    openfeign:
      client:
        config:
          default:
            connect-timeout: 1000 # 连接超时时间
            read-timeout: 3000 # 读取超时时间
            retryer: com.example.consumer.config.CustomRetryer

五、底层实现

OpenFeign超时的底层实现是通过配置底层的HTTP客户端来实现的。OpenFeign允许你在请求连接和读取数据
阶段设置超时时间,具体的超时配置可以通过设置HTTP客户端的连接超时(connectTimeout)和读取超时
(readTimeout)来实现,你可以在配置文件中设置超时参数。
OpenFeign底层的HTTP客户端,可以使用Apache HttpClient或OkHttpClient来实现,默认使用的是Apache
HttpClient实现的。

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

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

相关文章

Overleaf 无法显示图片

问题描述 在Overleaf中的代码为: \begin{figure}\centering\includegraphics[width0.98\linewidth]{figures/test.png}\caption{This is a test.}\label{fig:test} \end{figure}但无法正常显示图片: 解决方案 修改编译模式为正常Normal而非快速Fast …

Python 工具库每日推荐【python-docx】

文章目录 引言Python 文档处理库的重要性今日推荐:Python-docx 工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:自动生成个性化证书案例分析高级特性样式应用表格操作扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计模…

八大排序--03插入排序

假设数组 arr[] {5,7,4,2,0,1,6},请通过插入排序的方式,实现从小到大排列: 方法:插入排序默认待排数组中的第一个是已经排好序的数值;定义游标从第二个数据开始不断向后方进行遍历,并将游标指向的数据不断插入到排好序…

探索Ultralytics YOLO11在视觉任务上的应用

前言 在人工智能持续发展的当下,有一点是确凿无疑的:模型正变得愈发优秀、快捷和智能。就在人们以为YOLO系列已登峰造极之时,Ultralytics推出了最新升级版——YOLO11。需要注意的是,这里不是YOLOv11,他们简化了命名方…

秋季猫咪掉毛严重怎么办?宠物空气净化器到底有没有用?

告别炎热的夏天,秋意随着家里猫咪新一轮的掉毛一起到来。我家两只布偶齐齐发力,疯狂掉毛,家里每个角落无一幸免。衣服上、地板上,肉眼可见家里的毛发量在不断增多,又陷入了日复一日的清理大战。除此之外,对…

erlang学习:Linux命令学习10

从百度网盘下载文件 共享百度网盘获得链接 https://pan.baidu.com/s/1iUOTAWr1SRlL2fBZ7lIV拿到链接之后在浏览器中进行下载,可以查看下载链接 右键这些文件即可得到下载链接 类似于长这样 https://bdbl-cm01.baidupcs.com/file/b02f72906b3d0d07130be625eabc76…

12306积分换的一等座还有零食

“12306积分换的一等座还有零食!”这可真是个意外的惊喜呢!平时积累的小积分,竟然能兑换到如此舒适的一等座车票,而且还附赠了精致的小零食,真是让人倍感贴心与满足。这样的体验,不仅让旅途变得更加惬意&am…

YOLOv8实战TT100K中国交通标志检测【数据集+YOLOv8模型+源码+PyQt5界面】

YOLOv8实战TT100k交通标志识别 文章目录 研究背景资源获取1.前言1.1 YOLO 系列:中国交通标志检测领域的璀璨明星1.2 Transformer与注意力机制:为中国交通标志检测注入新活力1.3 中国交通标志检测技术:迎接挑战,砥砺前行1.4 YOLOv8…

刷题训练之解决 FloodFill 算法

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟练掌握解决 FloodFill 算法。 > 毒鸡汤:学习,学习,再学习 ! 学,然后知不足。 > 专栏选自&#…

面试(十)

目录 一. 单元测试 二. FreeRTOS和裸机哪个实时性好? 三. 怎么判断某个程序的运行时间 四. 函数指针 五. 全局变量被线程使用冲突 5.1 使用互斥锁 5.2 使用读写锁 5.3 使用原子操作 六. 局部变量没有初始化是什么值 七. uint_8 n 255 , n等于多少 八. …

利基营销:如何为小众受众制定内容营销策略?AIGC大模型创新思维数字化转型商业模式专家培训讲师谈短视频内容社私域数字经济人工智能

了解利基营销 什么是利基营销? 简单来说,利基营销就是专注于特定范围的潜在客户群,而不是针对广泛的人群。 实际上,利基营销可以比作为拥有露营装备的人而不是所有热爱户外活动的人定制内容。露营爱好者会欣赏专门针对他们的需…

最佳实践(1)

1.Java 集合概览 Java 集合,也叫作容器,主要是由两大接口派生而来:一个是 Collection接口,主要用于存放单一元素;另一个是 Map 接口,主要用于存放键值对。对于Collection 接口,下面又有三个主要…

Windows 11 企业版LTSC 2024正式发布(附链接)

随着微软最新正式发布的Windows 11 24H2,同时也带来了大家翘首以盼的Windows 11企业版 LTSC 2024,我们看到了Windows操作系统在企业级稳定性和个人用户体验上的又一次飞跃。虽然LTSC(长期服务通道)版本主要面向企业用户&#xff0…

RabbitMQ安装(Ubuntu环境)

安装Erlang RabbitMq需要Erlang语⾔的⽀持,在安装rabbitMq之前需要安装erlang # 更新软件包 sudo apt-get update # 安装 erlang sudo apt-get install erlang 查看erlang版本 erl 退出命令 halt( ). 安装RabbitMQ # 更新软件包 sudo apt-get update # 安装 rabbi…

python迭代器和生成器区别是什么

python中迭代器和生成器的区别 1、共同点 生成器是一种特殊的迭代器。 2、不同点 a、语法上: 生成器是通过函数的形式中调用 yield 或()的形式创建的。 迭代器可以通过 iter() 内置函数创建。 b、用法上&#x…

面试题:Redis(一)

1. redis是单线程还是多线程? 2. IO多路复用听说过么? 3. Redis为什么快? 1. Redis是单线程还是多线程? 版本不同,Redis基于的架构也不同,所以单单问是单还是多线程并不严谨 3.x 之前 redis都是单线程 4.x …

Tianrui Green Shield

Tianrui Green Shield,即天锐绿盾,是一款专注于企业数据防泄密的软件系统。以下是对天锐绿盾的详细介绍: 一、基本信息 产品名称:天锐绿盾(又名绿盾信息安全管理软件)公司官网:www.drhchina.co…

VM虚拟机安装 CentOS 7.6 部署宝塔面板实操

一、centos下载 进入centos官网下载页面,选择7.6版本,依次点击 tree-》isos-》x86_64/-》CentOS-7-x86_64-DVD-1810.iso 进行下载。 centos官网下载页面: https://wiki.centos.org/Download.html1、打开下载页面 二、配置CentOS 7的网络 1、…

【Java 并发编程】多线程安全问题(上)

前言 虽然并发编程让我们的 CPU 核心能够得到充分的使用,程序运行效率更高效。但是也会引发一些问题。比如当进程中有多个并发线程进入一个重要数据的代码块时,在修改数据的过程中,很有可能引发线程安全问题,从而造成数据异常。 p…

可视化-最小二乘法拟合直线

目录 1、最小二乘法拟合直线 2、需要用到的公式 3、计算各个参数 ,得到函数表达式 4、可视化-绘画图像 1、最小二乘法拟合直线 double x[15] {29,34,39,44,49,54,59,64,69,74,79,84,89,94,99}; double y[15] { 0.2989,0.3036,0.3084,0.3133,0.3182,0.3231,0.…