首页 > 其他分享 >fegin的retry机制

fegin的retry机制

时间:2024-06-15 21:11:53浏览次数:15  
标签:retry 服务 fegin 访问 重发 机制 超时 8404

服务间调用如果因为网络原因访问失败了,也可以考虑使用fegin的重发功能来重新访问服务。

配置了 ribbon或者loadBalance后,重发会根据负载均衡规则寻找新服务。

举例:feignServer客户端访问userModel服务(两个节点userModel1,userModel2)如果使用轮询策略(负载均衡)且就爱社userModel1网络中断,则feignServer访问userModel微服务,先访问userModel1发现连接失败(connect)

则重发服务再次访问userModel2,如果2也失败,会继续轮询访问userModel1。  如果userModel微服务部署的节点足够多,利用重发服务一定可以拿到响应值。

feign目前支持的重发只支持超时重发,如果要满足其他场景可以自己定义retryer重发器。

测试例子:

配置重发器 (fegin默认不使用重发机制)

 

 两个服务节点8401服务和8404服务

 其中8404服务发布的接口方法 设置线程休眠8秒钟

 

客户端设置超时时间来模拟fegin超时后重发服务

 见如上配置可知,当客户端访问到8401端口服务,则正常访问,如果访问8404端口服务,connect连接建立之后,由于8404服务端口线程休眠了8秒钟,导致在第5秒钟时fegin就触发了超时(5秒内未拿到resonse),因此触发重发。

测试结果:第一次访问的8401端口服务,第二次访问的8404端口服务。可以看到时间开销为15秒。

为什么拿到结果的时间消耗是15秒呢? 由于我配置的connect连接超时设置是5秒,超时重发间隔是10秒,因此在请求8404服务失败后(花费5秒)。间隔10秒(花费10秒),轮询到下一个服务节点,调用服务成功,总共15秒。

由下图可得 8404服务调用了一次(超时) 8401服务调用了两次

 

 

 跟踪源码

feign-core.jar.feign.SynchronousMethodHandler(类)调用invoke()方法

 将代码拷出来注释   

@Override
public Object invoke(Object[] argv) throws Throwable {
RequestTemplate template = buildTemplateFromArgs.create(argv);
//获得feign服务的超时设置(见上面yml文件的配置)
Options options = findOptions(argv);
//获得配置的重发器
Retryer retryer = this.retryer.clone();
while (true) {
try {
//执行http服务 如果超时则封装一个RetryableException抛出 被下方代码捕获后进行重发
return executeAndDecode(template, options);
} catch (RetryableException e) {
try {
//判断重发次数和重发间隔
retryer.continueOrPropagate(e);
} catch (RetryableException th) {
Throwable cause = th.getCause();
if (propagationPolicy == UNWRAP && cause != null) {
throw cause;
} else {
throw th;
}
}
if (logLevel != Logger.Level.NONE) {
logger.logRetry(metadata.configKey(), logLevel);
}
continue;
}
}
}

 

 然后这里有个坑,如果配置了熔断方法,重发服务会失败,在超时后会进入熔断回调方法fallback,而不是进行重发。

上诉代码都是在配置中取消了熔断服务。

加上熔断服务。

 调试代码:发现异常类型是HytixTimeoutException

 由重发执行的代码来看,只有IOExcetion才会被捕获封装成RetryableException异常。

 

 执行命令的线程变了

 

 不加熔断方法(前面重发执行成功)时的线程是http-nio-8403 增加熔断方法后执行上诉访问微服务代码的线程变成了hystrix-HystrixCircuitBreakerFactory

 

标签:retry,服务,fegin,访问,重发,机制,超时,8404
From: https://www.cnblogs.com/UUUz/p/18249721

相关文章

  • 【SPARK-CORE】shuffle机制
    本文主要介绍spark的shuffle机制 shuffle的产生Spark作业被分解为多个Stage,每个Stage包含多个任务(Task)。在需要重新分区的数据操作时因为需要进行数据的交换因此会产生Shuffle边界,即两个Stage之间需要进行Shuffle操作。 shuffle的各个阶段1、shufflemap阶段......
  • SCI一区 | Matlab实现NGO-TCN-BiGRU-Attention北方苍鹰算法优化时间卷积双向门控循环
    要在Matlab中实现NGO-TCN-BiGRU-Attention北方苍鹰算法进行多变量时间序列预测,需要按照以下步骤进行:准备数据:首先,准备多变量时间序列数据。确保数据已经进行了预处理,例如归一化或标准化,以便神经网络能够更好地进行学习和预测。构建NGO-TCN-BiGRU-Attention模型:根据算法的......
  • Python中的垃圾回收机制
    1.引言在现代编程中,垃圾回收是确保程序稳定运行的关键技术之一。Python,作为一种高级编程语言,拥有一套成熟的垃圾回收机制,它在背后默默地管理着内存,确保程序不会因为内存泄漏而崩溃。本文将深入探讨Python中的垃圾回收机制,以及它如何影响我们的代码。2.Python内存管理基......
  • CPU 时间片轮转机制
    CPU时间片轮转机制我们平时在开发的时候,感觉并没有受cpu核心数的限制,想启动线程就启动线程,哪怕是在单核CPU上,为什么?这是因为操作系统提供了一种CPU时间片轮转机制。时间片轮转调度是一种最古老、最简单、最公平且使用最广的算法,又称RR调度。每个进程被分配一个时间段,......
  • JVM类加载机制
    类加载机制概述类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为连接(Link)。初始化的单例......
  • JVM垃圾回收策略机制和算法
    判断对象的存活引用计数法给对象添加一个引用计数器,当对象增加一个引用时计数器加1,引用失效时计数器减1。引用计数为0的对象可被回收。(Python在用,但主流虚拟机没有使用)优点:快,方便,实现简单。缺陷:对象相互引用时(A.instance=B同时B.instance=A),很难判断对象是否该回收。......
  • 【SPARK-CORE】checkpoint机制
    本文主要介绍SPARKRDD的checkpoinnt机制 checkpoint机制介绍checkpoint是讲RDD保存到可靠的存储中的机制,主要目的是提高应用的容错能力和持久性。Checkpointing将数据从内存中转移到磁盘存储,使得在出现节点故障时,Spark可以从存储中恢复数据,而不需要重新计算所有的数据。这......
  • 6、Git之团队协作机制
    6.1、团队内协作6.1.1、创建本地库如上图所示,一个名叫刘备的人,在本地电脑中创建了一个项目,并使用git来维护。6.1.2、推送本地库到代码托管中心如上图所示,刘备想让别人也能看到自己本地库中的内容,就通过push命令,将本地库复制上传到代码托管中心,形成远程库。关于代码托......
  • 【Java】 反射机制及其应用
    >>【痕迹】QQ+微信朋友圈和聊天记录分析工具>>(1)纯Python语言实现,使用Flask后端,本地分析,不上传个人数据。>>(2)内含QQ、微信聊天记录保存到本地的方法,真正实现自己数据自己管理。>>(3)数据可视化分析QQ、微信聊天记录,提取某一天的聊天记录与大模型对话。>>下载地......
  • 探索Spring Boot的自动配置机制
    探索SpringBoot的自动配置机制SpringBoot作为一个快速开发框架,通过其自动配置机制大大简化了Spring应用的开发过程。本文将详细介绍SpringBoot的自动配置机制,并结合示例说明其工作原理。1.自动配置的原理SpringBoot的自动配置依赖于自动配置类和条件注解。具体流程......