OpenFegin

文章目录

  • 一、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 {@Beanpublic 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;}@Overridepublic 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);}}@Overridepublic Retryer clone() {return new CustomRetryer();}
}

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

spring:application:name: nacos-consumer-democloud:nacos:discovery:server-addr: localhost:8848username: nacospassword: nacosregister-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.xdnf.cn/news/1557819.html

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

相关文章

『网络游戏』Tips弹窗队列【10】

修改脚本:DynamicWnd.cs 修改脚本:GameRoot.cs 运行项目 - Tips提示消息按顺序依次弹出显示 修改代码:GameRoot.cs 修改代码:LoginSys.cs 运行项目 设置初始化函数 将CreateWnd设置为隐藏 运行项目 本章结束

Python爬虫之正则表达式于xpath的使用教学及案例

正则表达式 常用的匹配模式 \d # 匹配任意一个数字 \D # 匹配任意一个非数字 \w # 匹配任意一个单词字符(数字、字母、下划线) \W # 匹配任意一个非单词字符 . # 匹配任意一个字符(除了换行符) [a-z] # 匹配任意一个小写字母 […

【斯坦福CS144】Lab3

一、实验目的 完成 TCPSender 的四个接口。 二、实验内容 在该实验中,我们需要完成 TCPSender 的以下四个接口: **fill_window:**TCPSender 从 ByteStream 中读取数据,并以 TCPSegement 的形式发送,尽可能地填充接…

多端同步的收银系统源码

随着经济的不断发展,很多门店越来越趋向连锁品牌化,收银系统自然也成为很多连锁门店必不可少的软件工具。希望通过一套软件可以帮助门店解决门店线下销售、会员管理、连锁多门店管理、线下线上一体化、商品库存管理等难题实现降本增效,为了方…

【C++】map详解

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

ESP8266使用AT指令完成MQTT功能

ESP8266使用AT指令完成MQTT功能 在esp8266设备中烧录安信可的AT固件之后,进行AT指令完成信息发布,并最终实现在Homeassistant中发布传感器并设置传感器状态。 一、基础指令 以下是完整的步骤和对应的AT指令: 1. 配置ESP8266为Station模式 …

10.8学习

1.CAP ★一致性(2PC、3PC、Paxos、Raft) ●强一致性:数据库一致性,牺牲了性能 ACID:原子性、一致性、隔离性、持久性 ●弱一致性:数据库和缓存,延迟双删、重试 ●单调读一致性:…

[面试] java开发面经-1

前言 目录 1.看到你的简历里说使用Redis缓存高频数据,说一下Redis的操作 2.说一下Redis的缓存击穿、缓存穿透、缓存雪崩 3.你的项目中使用了ThreadLocal,那么当有两个请求同时发出时,会怎么处理,可以同时处理两个请求吗 4.使用…

01_InfluxDb

InFluxDb 概览课程地址Flux语言安装使用场景底层原理-数据结构数据价值热数据冷数据 数据只写不改InFluxDb 1.8 生态InFluxDb查询语言 TelegrafChronograph_画面插件Kapacitor InFluxDb 2.2 生态InFluxDb查询语言 Telegrapf 集群集群方案 概览 时序数据库,对时序场景有特别的优…

java web gis 快速搭建开发环境_服务端搭建

前言: 链接:https://pan.baidu.com/s/15i7FxthazW0J87D5jWh5ng?pwd32nd 提取码:32nd 复制这段内容后打开百度网盘手机App,操作更方便哦 Java 环境 jdk 1.8 ; maven ; 中间件: redis 数据库: postgres 1.4 ; postgis 代码管理: git 客户端 开发工…

【每日一题 | 24.10.8】确定字符串是否是另一个的排列

1. 题目2. 解题思路3. 代码实现(AC_Code) 上期回顾:【每日一题 | 24.10.7】Fizz Buzz 经典问题 个人主页:C_GUIQU 归属专栏:每日一题 1. 题目 确定字符串是否是另一个的排列 2. 解题思路 题目核心要求:理解字符串排列…

使用最小二乘法画噪声数据的近似曲线

文章目录 问题MATLAB代码验证数据1验证数据2 问题 已知有系列含有噪声的数据(x , y)用最小二乘法计算m和b。(ymxb) MATLAB代码 disp(This promgram perform a leastsquares fit of an); disp(input data set to a straight line.); n_points input(E…

HTB:Tactics[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Which Nmap switch can we use to enumerate machines when our ping ICMP packets are blocked by the Windows firewall? 2.What does the 3-letter acronym SMB stand for? 3.What port does SMB use to operate at? 4.What comma…

python数据分析与可视化工具介绍-numpy库

NumPy(Numerical Python的简称),是科学计算基础的一个库,提供了大量关于科学计算的相关功能,例如,线性变换,数据统计,随机数生成等。其提供的最核心的类型为多维数组类型&#xff08…

DAMA数据管理知识体系(第7章 数据安全)

课本内容 7.1 引言 概要 数据安全包括安全策略和过程的规划、建立与执行,为数据和信息资产提供正确的身份验证、授权、访问和审计数据安全来源要求 利益相关方政府法规特定业务关注点合法访问需求合同义务语境关系图 图7-2 语境关系图:数据安全业务驱动因…

微信小程序python+uniapp毕业论文选题系统设计与实现 lj141

目录 项目介绍具体实现截图开发者工具介绍技术路线性能/安全/负载方面开发语言以及框架介绍python-flask核心代码部分展示python-django核心代码部分展示详细视频演示源码获取 项目介绍 考虑到实际生活中在毕业论文选题管理方面的需要以及对该系统认真的分析,将小程序权限按管…

探索循环神经网络RNN:解锁序列数据的奥秘

在这个数据驱动的时代,机器学习模型已经深入到我们生活的方方面面,从智能推荐系统到自然语言处理,无一不彰显其强大的能力。在众多模型中,循环神经网络(Recurrent Neural Network, RNN)以其独特的结构和对序…

STM32-HAL库 驱动DS18B20温度传感器 -- 2024.10.8

目录 一、教程简介 二、驱动理论讲解 三、CubeMX生成底层代码 四、Keil5编写代码 五、实验结果 一、教程简介 本教程面向初学者,只介绍DS18B20的常用功能,但也能满足大部分的运用需求。跟着本教程操作,可在10分钟内解决DS18b20通信难题。…

基于uniapp+django微信小程序 食品安全信息管理系统

目录 项目介绍具体实现截图开发者工具介绍技术路线性能/安全/负载方面开发语言以及框架介绍python-flask核心代码部分展示python-django核心代码部分展示详细视频演示源码获取 项目介绍 食品安全信息管理系统设计的目的是为用户提供食品信息、科普专栏、食品检测、检测结果、交…

Chromium 中js Fetch API接口c++代码实现(二)

Chromium 中JavaScript Fetch API接口c代码实现(一)-CSDN博客 接着上一篇继续介绍调用,上函数堆栈。 1、打开http://192.168.8.1/chfs/shared/test/test02.html 此标签进程ID12484, 2、打开vs附加上此进程ID12484 3、点击页面测…