博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringCloud基础之断路器
阅读量:6786 次
发布时间:2019-06-26

本文共 1718 字,大约阅读时间需要 5 分钟。

1.断路器

在微服务架构中,存在着多个微服务,彼此之间可能存在依赖关系,当某个单元出现故障或者网络不通时,就会因为依赖关系形成故障蔓延,最终导致整个系统的瘫痪,相对于传统架构更加不稳定。为了解决这样的问题,因此产生了断路器模式。 断路器本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,“断路器”能够及时切断故障电源,防止发生过载、发热甚至起火等严重后果。 在分布式架构中,断路器模式的作用是类似的,当某个微服务发生故障时,通过断路器的故障监控,向调用方返回一个错误响应,而不是长时间的等待,这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。 Netflix Hystrix 在Spring Cloud中使用了Hystrix来实现断路器的功能。Hystrix是Netflix的分布式套件之一,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。 在前文中,已经创建过服务注册中心,两个服务提供者,两个服务消费者。

断路器工作原理

服务端的服务降级逻辑会因为hystrix命令调用依赖服务超时而触发,也就是说调用服务超时会进入断路回调逻辑处理。但是即使这样,受限于Hystrix超时时间的问题,调用依然会有可能产生堆积。

这个时候断路器就会发挥作用。这里涉及到断路器的三个重要参数: 快照时间窗 断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。

请求总数下限 在快照时间窗内,必须满足请求总数下限才有资格熔断。默认为20,意味着在10秒内,如果该hystrix命令的调用次数不足20,即使所有的请求都超时或者其他原因失败,断路器都不会打开。

欢迎大家一起学习研究相关技术愿意了解源码的朋友直接求求交流分享技术:2147775633

错误百分比下限 当请求总数在快照时间窗口内超过了下限,比如发生了30次调用,如果在这30次调用中有16次发生了超时异常,也就是超过了50%错误百分比,在默认设定50%下限情况下,这时候就会将断路器打开。

因此,断路器打开的条件是:在时间快照窗口期(默认为10s)内,至少发生20次服务调用,并且服务调用错误率超过50%。

不满足条件时断路器并不会打开,服务调用错误只会触发服务降级,也就是调用fallback函数,每个请求时间延迟就是近似hystrix的超时时间。如果将超时时间设置为5秒,那么每个请求都要延迟5每秒才会返回。当断路器在10秒内发现请求总数超过20并且错误率超过50%,这时候断路器会打开。之后再有请求调用的时候,将不会调用主逻辑,而是直接调用降级逻辑,这个时候就不会等待5秒之后才会返回fallback。通过断路器实现自动发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果。

在断路器打开之后,处理逻辑并没有结束,此时降级逻辑已经被切换为主逻辑了,那么原来的主逻辑要如何恢复呢?实际上hystrix也实现了这一点:当断路器打开,对主逻辑进行熔断之后,hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的主逻辑,当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑,如果此次请求正常返回,那么断路器将进行闭合,主逻辑恢复,如果这次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时。

换句话说,断路器每隔一段时间进行一次重试,看看原来的主逻辑是否可用,可用就关闭,不可用就继续打开。

通过上面的机制,hystrix的断路器实现了对依赖资源故障的处理,对降级策略的自动切换以及对主逻辑的自动恢复。这使得我们的微服务在依赖外部服务或资源的时候得到了非常好的保护,同时对于一些具备降级逻辑的业务需求可以实现自动化的切换和恢复,相比于设置开关由监控和运维来进行切换的传统实现方式显得更为智能和高效。

转载于:https://juejin.im/post/5b909526f265da0aa528e5b3

你可能感兴趣的文章
线段树(可能还会有树状数组吧)
查看>>
Gnome 3.2 发布计划及新功能
查看>>
利用bobo-browse 实现lucene的分组统计功能
查看>>
/MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
查看>>
ubuntu server 使用parted分区
查看>>
solr实现满足指定距离范围条件的搜索
查看>>
[转载]Web前端研发工程师编程能力飞升之路
查看>>
Redis
查看>>
XINS 3.0 正式版发布,远程 API 调用规范
查看>>
(转)Oracle中For和while及一些应用
查看>>
jQuery基础及选择器
查看>>
DragonFly BSD 3.2 发布
查看>>
C#中为什么需要装箱拆箱操作?
查看>>
PHP类中一般方法与静态方法的疑问
查看>>
值得 Web 开发人员收藏的20个 HTML5 实例教程
查看>>
移动设备、手机浏览器Javascript滑动事件代码
查看>>
Ubuntu 中的VI和vim
查看>>
Libgdx window add alpha action change the background actor alpha
查看>>
(转)过滤器原理
查看>>
JavaScript 触发click事件 兼容FireFox,IE 和 Chrome
查看>>