眼见为实:关于微服务熔断这几个知识点,你可能理解错了

news2024/11/20 8:23:31

 微服务熔断,是当微服务中某个子服务,发生异常不可用,其他服务在进行远程调用时不能正常访问而一直占用资源,导致正常的服务也发生资源不能释放而崩溃,这时为了不造成整个微服务群瘫痪,进行的保护机制

01 关于微服务熔断,意想不到的实验结果

我们基于 SpringCloud,搭了一个简单的微服务场景,应用 A 调 B,在 A 的测试接口上设置了 Hystrix 熔断器,熔断超时时间是 1s,如下图:

你是否知道:

  • 这个熔断超时时间指的是 A 接口的执行时间,还是仅 A 调用 B 的调用时间?

  • A、B 执行逻辑计算的时间都设置了 500ms,熔断超时时间是 1s,熔断器未开启时,A 是否能拿到 B 的返回结果?

  • A 接口超时、抛 Exception 这两种场景都能触发它的降级熔断,底层触发逻辑有什么不一样?看似同步的请求竟然是通过异步线程来实现的?

  • 当 A 触发熔断器开启后,它是否还能成功调用到 B 接口?难道就这样让用户一直失败

实验结果究竟如何,我们一起往下看。(心急的小伙伴可以直接滑到文末,查看答案~)

02 可视化熔断实验的 demo 介绍

本次实验,基于 SpringCloud,Eureka 作为注册中心,单机部署,采用 OpenFeign 实现 RPC 调用,Hystrix 实现熔断机制,下面是应用 A(即 consumer)的测试接口代码:

我们借助 Kindling 程序摄像头,它能够查看分析一次请求调用下的所有线程的工作情况记录的能力,来看下实验结果。

03 实验 1: 当 A 未接入断路器,A 调用 B 的线程分析

当 A 未接入断路器,请求是通过执行线程 exec 来执行,请求开始,打了 A 开始 Sleep 的日志,A sleep 500ms 之后,又打了开始调用 B(即 producter)的日志,最后拿到 B 的执行结果,请求结束。(关于 kindling 摄像头程序操作手册:http://www.kindling.space:33215/project-3/doc-94/)

04 实验 2: 当 A 接入断路器,A 调用 B 的线程分析

当 A 接入断路器后,执行线程 exec 上没有打执行日志了,反而是多了一个 hystrix-ConsumerController 线程,打了 A 开始 sleep 的日志。

接着又由这个线程 sleep500ms,再调用 B,但是我们在这个线程上找不到 net B 的请求事件,我们可以看到,是由另外一个线程 hystrix-producter 来和 B 建立网络连接。

但是我们点击这个线程,查看它从 B 读到的执行结果,它能拿到正常的返回结果:

但是,我们发现最后 A 返回给用户的报文却是:

其实这就是 A 接口上的熔断超时时间在起作用,如下图,Asleep 了 500ms,B 也执行了 500ms,再加上系统调用等时间开销,A 接口的执行时间肯定会超过我们设置的熔断超时时间是 1s,所以,Hystrix 上的 Timer 线程,监测到时间超时,进入了降级服务。

05 实验 3: 当 A 接入断路器,B 直接返回 Exception,线程分析

这个实验,我们让 B 不再执行 500ms,而是直接返回 Exception,也就是说,A 不会再因为超时而进入降级服务。同样的,它也是由多个 Hystrix 线程执行业务,但是和上一个实验中,Timer 线程监测到超时而触发降级的情况不同,这里是由 hystrix-consumerController 直接触发降级。

虽然最后这两个实验都是进入了降级服务,但是通过 Kindling 程序摄像头我们就能清楚的看到,它是怎么被触发降级的。

06 Hystrix 配置讲解

再回到配置这里,刚才实验中提到的熔断超时时间就是通过上图中,红框里的配置实验的,另外,第 1 条配置是 Hystrix 的开关。第 2、3、4 条配置是一起的,我这里配置的意思是:当 10s 内,接口的请求次数达到 10 次,且失败率在 60%以上,就会触发熔断。

07 实验 4: 当 A 接入断路器,且触发熔断后,请求调用情况

当 A 熔断器开启,所有请求直接返回降级结果,如下图:

但是等过了熔断时间窗口期,我们发现,Hystrix 有让一少部分请求正常执行:

这就是熔断器的自我恢复机制,熔断器一共有三种状态,断开后,过了时间窗口期,它就会允许一部分请求进行尝试,如果成功次数达到阈值,熔断器就会关闭,服务恢复。

最后总结一下开篇疑问:

  • 熔断超时时间指的是接口的执行时间

  • 接口超时是有 HystrixTimer 线程定时监测到时间超时,触发的降级,而接口异常是通过 Hystrix 执行线程触发降级

  • 熔断器触发之后,过了窗口时间,熔断器会允许少部分请求正常执行,尝试自我恢复

  • Hystrix 的底层用的也是线程池,一个线程执行业务,一个线程做网络调用,还有个线程做超时检测

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

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

相关文章

漏洞分析|Apache Airflow Pinot Provider 命令注入漏洞

项目介绍 Airflow 是一个使用 python 语言编写的 data pipeline 调度和监控工作流的平台。Airflow 是通过 DAG(Directed acyclic graph 有向无环图)来管理任务流程的任务调度工具, 不需要知道业务数据的具体内容,设置任务的依赖关…

【头歌实验】四、Python分支结构

文章目录>>>第1关:判断闰年任务描述案例分析相关知识条件表达式分支语句测试说明参考答案>>>第2关:计算快递费用任务描述案例分析相关知识分支结构向上取整的函数ceil测试说明参考答案>>>第3关:成绩等级判定任务描…

同惠TH2830精密LCR数字电桥性能特点

TH283X系列是新一代低预算成本,高性能紧凑型LCR数字电桥,采用最新工艺和高密度电路设计,浓缩大型LCR测试仪的精华、紧凑、小巧。取消传统机械电源开关,采用软件控制电源开关。0.05%的基本精度和良好的测试稳定性可与高端机型媲美。…

关于环2数字资产html网页设计

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | | HTML期末大学生网页设计作业 HTML:结构 CSS:样式 在操作方面上运用了html5和css3, 采用了divcss结构、表单、超…

下一代Ajax技术 — Fetch的学习与使用

一、初识fetch Fetch被称为下一代Ajax技术,采用Promise方式来处理数据。是一种简洁明了的API,比XMLHttpRequest更加简单易用。 XMLHttpRequest 我们先来看看使用纯XMLhttpRequest来实现一次简单ajax请求的代码: //获取XMLHttpRequest实例对象 const x…

TypeScript(三)面向对象

TypeScript 类的定义 我们可以使用class关键字来定义一个类; 我们可以声明类的属性:在类的内部声明类的属性以及对应的类型 如果类型没有声明,那么它们默认是any的; 我们也可以给属性设置初始化值; 在默认的strictPr…

MSG企业行·AI+医疗专场成功举办!!昇思MindSpore助力智慧医疗深度发展!

【MSG企业行AI医疗】 11月19日下午,【MSG企业行AI医疗】线上交流会成功举办! 昇思MindSpore开源社区联合大连人工智能生态创新中心、深圳大学、武汉理工大学、摩赛恩科技、连心医疗、众享未来融合研究院,邀请到了5人工智能与医疗行业嘉宾&a…

利用navicat定时传输数据到另一个库

需求:每天定时6点,12点,18点将SQLserver的数据推送到mysql库中 之前就看到navicat有个自动运行(有的版本叫计划),但是不会用,刚好趁这个机会学一学 提前说一点,可能需要先换成admin…

antd:ConfigProvider+getPopupContainer解决筛选框遮挡问题(及其他浮层问题)

一. 问题场景二. 解决方案三. 代码示例一. 问题场景 当表格高度太低(下图业务场景出现在数据条数太少时),column中有筛选框,可能会出现筛选框被遮挡的问题: 这是因为filter的下拉菜单渲染在table的表头栏&#xff0…

运算放大器的理解与应用

运算放大器的理解与应用 运算放大器简称运放,由于早期应用于模拟计算机中,用以实现数学运算,故得名“运算放大器”。主要是用在模拟电路中,比如放大器、比较器、模拟运算器,是电子工程师经常要用到的器件。运算放大器…

145646-22-6|表位肽EQKLISEEDL

c-Myc Peptide Trifluoroacetate 是一种合成肽,与人 c-myc 蛋白的 C-末端氨基酸 (410-419) 相对应,参与调控与生长有关的基因的转录过程。c-Myc Peptide Trifluoroacetate is a synthetic peptide corresponding to the C-terminal amino acids (410-419…

开源共建 | 中国移动冯江涛:ChunJun(原FlinkX)在数据入湖中的应用

ChunJun(原FlinkX)是一个基于 Flink 提供易用、稳定、高效的批流统一的数据集成工具。2018年4月,秉承着开源共享的理念,数栈技术团队在github上开源了FlinkX,承蒙各位开发者的合作共建,FlinkX得到了快速发展…

Spring Security验证码配置化开发

背景 在前两篇文章中给大家介绍了Spring Security的认证流程,包含对项目的定制化处理,可以明白security的设计还是比较强大的,通过一系列的过滤器注册的过滤器链,对流程进行链式的处理。 今天介绍一种以配置器的方式处理验证码生…

Day11--配置tabBar效果

1.创建tabBar分支 我的操作: 1》在其根路径下按住“shift”和鼠标右键进入powerShell界面,然后输入创建一个分支tabBar. ****************************** ****************************** ****************************** ****************** 2.创建ta…

生产质量管理系统有哪些功能?

随着中国市场经济的快速发展,中国产品正经历着“中国制造”向“中国创造”的转变,在这个过程中,企业经营也逐渐从低成本生产管理向质量经营方向发展,企业已经认识到质量的重要性,企业对质量管理的有效性也提出了更高的要求。 作为…

【Servlet】5:详解响应对象 HttpServletResponse

目录 | 响应对象 HttpServletResponse接口 HttpServletResponse的基本概述 响应对象返回 String 给Browser & 中文乱码问题 响应对象返回 int 给Browser 响应对象 解析HTML标签后 返回给Browser 本文章属于后端全套笔记的第三部分 (更新中)【后…

UI和UI有什么不同,是如何协助的

UX(用户体验)和UI(用户界面)是一个常用的术语。然而,尽管有复杂的联系,但网页设计的两个领域是两个不同的东西。事实上,有可能有一个用户界面优秀但用户体验差的网站。因此,了解UX和UI良好的网页设计非常重…

只需要改造一下实体类,以后再也不用写SQL了

文章目录只需要改造一下实体类,以后再也不用写SQL了 现状分析现状示例1. 建立人员表M.T.Person表,包含三个字段名称,年龄,身份证。2. 新增一条数据,也就是插入的情况。3. 获取单条数据内容,也是就是根据ID获…

经济师十大专业通过人数分析!选专业有谱了!

最近,很多同学在后台咨询,哪个专业的好通过,自己要如何选专业…… 小编特别整理了已经公布的各省市2021年初、中级经济师各专业通过情况数据,给大家参考! 2022年中级经济专业技术资格考试设《经济基础知识》和《专业知…

让学前端不再害怕英语单词(三)

前两章直通车↓↓↓ 让学前端不再害怕英语单词(一) 让学前端不再害怕英语单词(二) 由于前两章都反响强烈,都上了全站的热榜,所以今天打算把第三章也写出来 第三章我们主要讲一下css中的伪类的英语单词还有…