SpringCloud源码系列之(Ribbon、Hystrix超时正确配置)

这块的代码debug了一个礼拜,一开始看Fegin创建源码的时候没注意到,是基于RxJava的响应式编程。分析栈桢的时候,有很多异步栈桢。由于只是想搞清楚如下配置的生效时机、以及失效情况,期间还看了一堆与此无关的源码,真的头大
在这里插入图片描述
先贴一下正确的超时配置

ribbon:
  ReadTimeout: 3333
  ConectTimeout: 2000
feign:
  hystrix:
    enabled: true
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5555

服务降级流程:在Ribbon发送网络请求的同时,如果配置了hystrix降级,底层同时开启一个定时任务,间隔时间就是配置的hystrix超时时间,到点了,无论FeginClient有没有请求成功,都会先进行返回降级。对应的降级定时任务源码如下图。(里面的listener就是取的我们配置文件中的 timeoutInMilliseconds: 5555)。
断点位置:com.netflix.hystrix.util.HystrixTimer.addTimerListener()。
在这里插入图片描述
Ribbon超时流程:走正常的FeginClient发送请求的流程中,里面会进行读取我们配置的Ribbon超时时间(ribbon.ReadTimeout: 3333),Ribbon不配置的话默认是1s。贴一张debug的源码图如下。
断点位置:org.springframework.cloud.openfeign.ribbon.FeignLoadBalancer.execute()

在这里插入图片描述
整个过程是异步的,具体的实现底层用的是RxJava框架(发布、订阅模式)。如果正常的请求执行时间花了5s,但是在3s的时候,就被hystrix降级了,此时Ribbo在第5s的收到了返回结果,那么就会出一个诡异的现象,客户端收到的是降级请求,但是Fegin日志里面没报错,并且成功打印了本次的Fegin的request、reponse。因此我们的ribbon超时时间一般配置的比hystrix的超时时间小一点。

看源码大前提

首先我们要知道OpenFegin默认集成了Ribbon,也就是说只要我们使用了Fegin,Ribbon就一定会生效?答案是错误的,这个在之前的Cloud源码文章里面分析过了,只有当@FeginClient是通过注册中心调用服务的情况下,Ribbon才会生效。对应的Ribbon超时配置才会生效。
在这里插入图片描述
测试Fegin接口详情如下图。手动设置了服务提供方5s的超时
在这里插入图片描述

在这里插入图片描述

hystrix与ribbon超时的关系

先来说总结Ribbon超时相当于第一层壁垒,hystrix的超时相当于第二层壁垒。只有当(接口处理时间<Ribbon超时时间 && 接口处理时间< hystrix超时时间)时,接口才能正常响应,其他情况都会进行降级。

源码分析入口

具体的源码入口如下:feign.hystrix.HystrixInvocationHandler.invoke(),里面的run方法里面执行Ribbon负载均衡,返回服务调用请求的结果。getFallBack负责返回降级的结果。当Ribbon执行还没结束但是已经hystrix已经超时了,hystrix超时定时任务就会开启,触发getFallBack中的降级逻辑,然后返回结果。getRun、getFallback方法二选一返回。在这里插入图片描述

里面的run方法走的是正常的流程,在 Spring Cloud OpenFegin(创建、发送请求)源码 一文中已经分析过了。getFallBack就是走的降级流程,看下图的栈桢在这里插入图片描述
栈桢接着往下滑,可以看到getFallback就是降级定时任务触发的,和我分析的一样。到此关键节点的源码已经全贴出来了。其他具体的流程都在我脑子里哈哈哈哈哈哈,但是也怕忘,所以只贴关键代码方便日后回忆。

在这里插入图片描述

在这里插入图片描述

SpringCloud源码系列持续更新

  1. Spring Cloud OpenFegin(创建、发送请求)源码
  2. SpringCloud 之HttpClient、HttpURLConnection、OkHttpClient切换源码
  3. SpringCloud 源码系列之全局 Fegin 日志收集(okHttpClient、httpClient编码配置)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新能源智慧充电桩方案:AI视频分析技术如何助力充电桩智能监管?

随着AI人工智能、大数据、云计算等技术快速发展与落地&#xff0c;视频智能分析技术在智慧充电桩场景中的应用也越来越广泛。这种技术能够为充电桩站点提供全方位的监控和管理&#xff0c;提高运营效率&#xff0c;保障充电桩设备的安全和稳定运行。 通过TSINGSEE青犀&触角…

Spring重要知识点

一、Spring中相关概念 1.IOC 控制反转 IoC&#xff08;Inverse of Control:控制反转&#xff09;是⼀种设计思想&#xff0c;就是将原本在程序中⼿动创建对象的控制权&#xff0c;交由Spring框架来管理。IoC 在其他语⾔中也有应⽤&#xff0c;并⾮ Spring 所独有。 IoC 容器…

uniapp 微信小程序 内嵌H5网页办法

uniapp 微信小程序 内嵌H5网页办法 如图所示 1.新建webView页面 <template><web-view v-ifhttpUrl :srchttpUrl></web-view> </template><script>export default {data() {return {httpUrl: "",};},onLoad(options) {options.http…

C#,入门教程(07)——软件项目的源文件与目录结构

上一篇&#xff1a; C#&#xff0c;入门教程(06)——解决方案资源管理器&#xff0c;代码文件与文件夹的管理工具https://blog.csdn.net/beijinghorn/article/details/124895033 创建新的 C# 项目后&#xff0c; Visual Studio 会自动创建一系列的目录与文件。 程序员后面的工…

Unity—配置lua环境变量+VSCode 搭建 Lua 开发环境

每日一句&#xff1a;保持须臾的浪漫&#xff0c;理想的喧嚣&#xff0c;平等的热情 Windows 11下配置lua环境变量 一、lua-5.4.4版本安装到本地电脑 链接&#xff1a;https://pan.baidu.com/s/14pAlOjhzz2_jmvpRZf9u6Q?pwdhd4s 提取码&#xff1a;hd4s 二、高级系统设置 此电…

1月下半笔记(个人向)

最近才开始看d2l&#xff08;这种东西早该在两年前看的&#xff0c;拖到现在了&#xff09; 为了做项目还得学一手OpenGL&#xff08;被windows安装GLFW逼疯了&#xff09; 1.15 打完ICPC EC final回来&#xff0c;也许可以出一篇博客写下简单的题解。 对蛋白质相似空间子结…

你还在找PDF转Word的工具?一个好软件推荐,赶紧查收!

前言 前段时间朋友跟小白吐槽&#xff1a;为啥PDF文件转Word文档的工具都要收费&#xff1f; 因为他们都收费啊。 小白之前找了很多类似有这种功能的工具&#xff0c;都发现&#xff1a;不但收费&#xff0c;可能还附带全家桶&#xff0c;而且还有……广告&#xff01; 在一次…

Java学习(二十一)--JDBC/数据库连接池

为什么需要 传统JDBC数据库连接&#xff0c;使用DriverManager来获取&#xff1b; 每次向数据库建立连接时都要将Connection加载到内存中&#xff0c;再验证IP地址、用户名和密码&#xff08;0.05s~1s)时间。 需要数据库连接时候&#xff0c;就向数据库要求一个&#xf…

DNS寻址过程

用一张图详细的描述DNS寻址的过程&#xff0c;是高级前端进阶的网络篇&#xff1a; 主要是第三步要记仔细就行啦&#xff0c;每一步都要详细的记录下来&#xff0c;总结的脉络如下&#xff1a; 本地DNS缓存本地DNS服务器根域名服务器 顶级域名服务器再次顶级域名服务器权威域名…

【PIE-Engine 数据资源】全球 10 米土地覆盖产品 (ESA-2020)

文章目录 一、 简介二、描述三、波段四、示例代码参考资料 一、 简介 数据名称全球 10 米土地覆盖产品 (ESA-2020)时间范围2020年空间范围全球数据来源ESA WorldCover project 2020代码片段var imagespie. ImageCollection (“ESA/WORLD_COVER_2020”) 二、描述 全球 10 米土…

CVer从0入门NLP(二)———LSTM、ELMO、Transformer模型

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

(二十)Flask之上下文管理第一篇(粗糙缕一遍源码)

每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 &#x1f525;&#x1f525;本文已收录于Flask框架从入门到实战专栏&#xff1a;《Flask框架从入…

获取编译工具链默认的链接脚本

1、ld命令使用“–verbose”参数 命令&#xff1a;riscv64-linux-gnu-ld --verbose想使用自己的链接脚本&#xff0c;链接时使用“-T”指定

安装布隆过滤器

上传并解压文件解压文件 tar -zxvf RedisBloom-2.2.4.tar.gz 进入解压好的文件 make一下 返回进入conf 配置文件 loadmodule /usr/local/etc/redis/redisbloom.so 粘入 拷贝redisbloom.so到容器 : docker cp redisbloom.so redis:/usr/local/etc/redis 重启redis : docker …

MySQL(四)——约束

上期文章 MySQL&#xff08;三&#xff09;——函数 文章目录 上期文章概述约束演示外键约束添加外键删除外键删除/更新行为 总结 概述 概念&#xff1a;作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据 目的&#xff1a;保证数据库中数据的正确、有效性和完整性…

Unity XR 设置VR设备手柄按键按下事件

一、Unity设置 1、导入XR Interaction Toolkit插件&#xff0c;导入示例资源&#xff08;如下图&#xff09;。 2、设置新版XR输入事件 ①打开XRI Default Input Action 面板。 ②设置左手柄上的按键就点击Action Maps 列表下的 XRI LeftHand Interaction选项&#xff0c;设置…

JS-节点操作

DOM节点 DOM树里的每一个内容都称之为节点 节点类型 1&#xff09;元素结点 所有的标签 比如body、div html是根节点 2&#xff09;属性节点 所有的属性 比如href、class 3&#xff09;文本节点 所有的文本 4&#xff09;其他 查找节点 父节点查找 parentNode属性 …

Spring Boot - 利用Resilience4j-Circuitbreaker实现断路器模式_防止级联故障

文章目录 PreResilience4j概述Resilience4j官方地址Resilience4j-Circuitbreaker应用场景微服务演示Address servicePOMModelRepositoryServiceControllerData InitProperties测试 Order serviceModelRepositoryServiceSet UpProperties测试 探究断路器调用order-service API 2…

[已解决]前端使用el-upload,后端使用文件上传阿里云报错:异常信息:java.lang.NullPointerException: null

前端使用el-upload&#xff0c;后端使用文件上传阿里云报错&#xff1a; 报错原因&#xff1a;前端image参数未传进去 解决方法&#xff1a;在el-upload添加属性 name"image" 文件传进去了&#xff01;

Spring Boot Aop 执行顺序

Spring Boot Aop 执行顺序 1. 概述 在 spring boot 项目中&#xff0c;使用 aop 增强&#xff0c;不仅可以很优雅地扩展功能&#xff0c;还可以让一写多用&#xff0c;避免写重复代码&#xff0c;例如&#xff1a;记录接口耗时&#xff0c;记录接口日志&#xff0c;接口权限&…
最新文章