1.为什么需要熔断

分布式架构中,一个应用依赖很多服务非常常见,如果其中依赖的一个服务由于延迟过高产生阻塞,导致依赖该服务的应用也产生阻塞,如果该应用QPS较高,就会有大量的请求被阻塞,每个请求都占用了系统的CPU、内存、网络等资源,从而导致该应用由于服务器资源耗尽而拖垮。
如果这个应用还有上游服务,就会产生连锁反应,造成雪崩效果。
在服务延迟过高或者失败的时候,为系统提供保护机制快速返回失败,就可以缩短应用的等待时间,避免产生大面积请求阻塞和雪崩效应。

2.限流、降级、熔断的区别

限流:对并发访问的流量进行限制。主要行为有:限制并发数量、服务降级、分级请求(部分用户可以请求)、延时处理(削峰填谷),主要方式有:计数器(简单的流量技术+1)、漏斗模式(使用队列,队列长度限制)、令牌桶(先从令牌桶获取令牌才能访问)等。
降级:在流量高峰的时候,为了保全重要的服务,停掉一些不重要的服务,从而释放出更多资源。比如退款系统在流量高峰期,保障退款功能可用,停掉退款查询功能。
熔断:下游系统故障或者阻塞的时候,自动降级服务,快速返回错误。
熔断是降级的一种方式,降级又是限流的一种方式。

3.hystrix常用参数介绍

3.1 HystrixCommand和HystrixObservableCommand接口

HystrixCommand: 用在依赖的服务返回单个操作结果的时候。
HystrixObservableCommand:用在依赖的服务返回多个操作结果的时候,HystrixObservableCommand使用观察者模式

3.2 execute()、queue()、observe()、toObservable()命令

HystrixCommand实现了4个方法、HystrixObservableCommand实现了后面两个方法。
execute (): 同步执行,从依赖的服务返回一个单一的结果对象,或是在发生错误的时候抛出异常。
queue (): 异步执行,直接返回一个Future对象,其中包含了服务执行结束时要返回的单一结果对象。
observe () :返回Observable对象,它代表了操作的多个结果,它是一个Hot Observable。
toObservable(): 同样会返回Observable对象,也代表了操作的多个结果,但它返回的是 一个Cold Observable。

3.3 hystrix的一些默认值

circuitBreaker.sleepWindowInMilliseconds:断路器的快照时间窗,也叫做窗口期。可以理解为一个触发断路器的周期时间值,默认为5秒(5000)。
这个时间内如果发生断路的请求数超过了设置数则会熔断;如果发生了熔断,那么在这个时间后会成为半开状态。
circuitBreaker.requestVolumeThreshold:断路器的窗口期内触发断路的请求阈值,默认为20。
窗口期内的请求总数超过这个阈值才会判断错误率是否超过,如果超过就熔断。不超过这个阈值,不会发生熔断。
circuitBreaker.errorThresholdPercentage:断路器的窗口期内能够容忍的错误百分比阈值,默认为50(也就是说默认容忍50%的错误率)。
一个窗口期内,发生了100次服务请求,其中50次出现了错误。在这样的情况下,断路器将会被打开。

4.hystrix处理流程

4.1 创建HystrixCommand或HystrixObservableCommand对象
4.2 执行execute()、queue()、observe()、toObservable()命令
4.3 如果请求缓存功能被起用,并且命中缓存,缓存的结果会立即以Observable对象的形式返回
4.4 检查断路器是不是打开的状态,如果是打开的状态,直接执行getFallback()
4.5 如果和命令相关的线程池/请求队列/信号量 已经被占满,hystrix不会执行这个命令,直接执行getFallback()
4.6 执行HystrixCommand.run()或HystrixObservableCommand.construct(),如果这两个方法执行失败或者超时,则执行getFallback()
4.7 Hystrix会将“成功”、“失败”、“拒绝”、“超时” 等信息报告给断路器,而断路器会维护一组计数器来统计这些数据。断路器会使用这些统计数据来决定是否要将断路器打开,来对某个依赖服务的请求进行“熔断/短路”,直到恢复期结束。若在恢复期结束后,根据统计数据判断如果还是未达到健康指标,就再次 “熔断/短路”。
4.8 当Hystrix命令执行成功之后,它会将处理结果直接返回或是以Observable 的形式返回。

5.hystrix源码分析

5.1 HystrixCircuitBreaker

public interface HystrixCircuitBreaker {//每个Hystrix命令的请求都通过它判断是否被执行public boolean allowRequest();//返回当前断路器是否打开public boolean isOpen();//用来闭合断路器 void markSuccess();public static class Factory {...}static class HystrixCircuitBreakerImpl implements HystrixCircuitBreaker {...}static class NoOpCircuitBreaker implements HystrixCircuitBreaker {...}
}

5.2 HystrixCircuitBreakerImpl

//断路器对应HystrixCommand实例的属性对象
private final HystrixCommandProperties properties;
//用于让HystrixCommand记录各类度量指标的对象
private final HystrixCommandMetrics metrics;
//断路器是否打开的标志,默认为false
private AtomicBoolean circuitOpen = new AtomicBoolean(false);
//断路器打开或上一次测试的时间戳
private AtomicLong circuitOpenedOrLastTestedTime = new AtomicLong();

5.3 isOpen()

public boolean isOpen() {//判断断路器的打开/关闭状态//如果断路器打开标识为true, 则直接返回trueif (circuitOpen.get()) {return true;}//就从度量指标对象 metrics 中获取 HealthCounts 统计对象做进一步判断(该对象记录了 一个滚动时间窗内的请求信息快照,默认时间窗为10秒)HealthCounts health = metrics.getHealthCounts();//如果它的请求总数(QPS)在预设的阈值范围内就返回 false//阈值的配置参数为circuitBreakerRequestVolumeThreshold,默认值为20 if (health.getTotalRequests() < properties.circuitBreakerRequestVolumeThreshold().get()) {return false;}//如果错误百分比在阈值范围内就返回 false//该阈值的配置参数为 circuitBreakerErrorThresholdPercentage, 默认值为50if (health.getErrorPercentage() < properties.circuitBreakerErrorThresholdPercentage().get()) {return false;} else {// our failure rate is too high, trip the circuit//如果失败率超过阈值,就进行熔断if (circuitOpen.compareAndSet(false, true)) {// if the previousValue was false then we want to set the currentTime//如果之前是false,设置熔断的当前时间circuitOpenedOrLastTestedTime.set(System.currentTimeMillis());return true;} else {return true;}}
}

5.4 allowRequest()

public boolean allowRequest() {//根据配置对象properties中断路器判断强制打开或关闭属性是否被设置。如果强制打开,就直接返回false,拒绝请求if (properties.circuitBreakerForceOpen().get()) {return false;}//如果强制关闭,它会允许所有请求if (properties.circuitBreakerForceClosed().get()) {//调用 isOpen ()来执行断路器的计算逻辑,用来模拟断路器打开/关闭的行为isOpen();return true;}//!isOpen () I I allowSingleTest ()来判断是否允许请求访问return !isOpen() || allowSingleTest();
}
public boolean allowSingleTest() {//获取断路器开启的时间long timeCircuitOpenedOrWasLastTested = circuitOpenedOrLastTestedTime.get();//如果断路器开启,并且过了休眠期(窗口期)本次请求允许访问if (circuitOpen.get() && System.currentTimeMillis() > timeCircuitOpenedOrWasLastTested + properties.circuitBreakerSleepWindowInMilliseconds().get()) {if (circuitOpenedOrLastTestedTime.compareAndSet(timeCircuitOpenedOrWasLastTested, System.currentTimeMillis())) {return true;}}return false;
}

5.5 markSuccess()

该函数用来在 “半开路” 状态时使用。若Hystrix 命令调用成功,通过调用它将打开的断路器关闭, 并重置度量指标对象。

public void markSuccess() {if (circuitOpen.get()) {if (circuitOpen.compareAndSet(true, false)) {metrics.resetStream();}}
}

参考文档:
1.降级-熔断-限流-傻傻分不清楚 https://zhuanlan.zhihu.com/p/61363959
2.一文带大家彻底弄懂Hystrix原理机制! https://zhuanlan.zhihu.com/p/363518269
3.Hystrix熔断器使用时的三个参数介绍 https://blog.csdn.net/weixin_54707282/article/details/123406787
4.hystrix实现原理 https://www.jianshu.com/p/fc19f6ed6d0d?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
5.Hystrix实现原理 https://blog.csdn.net/skh2015java/article/details/120750565

Hystrix是怎么实现熔断的相关推荐

  1. 从Netflix的Hystrix框架理解服务熔断和服务降级

    本文讲的是从Netflix的Hystrix框架理解服务熔断和服务降级,伴随着微服务架构被宣传得如火如荼,一些概念也被推到了我们面前,其实大多数概念以前就有,但很少被提的这么频繁.想起有人总结的一句话, ...

  2. 微服务(八)——Hystrix服务降级、熔断、限流(上)

    目录 Hystrix服务降级.熔断.限流 Hystrix是什么 Hystrix停更进维 Hystrix的服务降级熔断限流相关概念 Hystrix支付微服务构建 JMeter高并发压测后卡顿 订单微服务 ...

  3. feign直接走熔断_SpringCloud微服务面试必问:Hystrix 服务降级、熔断

    本文作者:JLSong 本文链接:https://www.cnblogs.com/songjilong/p/12770999.html 1.Hystrix是什么? Hystrix 是一个用于处理分布式 ...

  4. Hystrix服务降级、熔断-微服务(十)

    服务降级 降级配置 @HystrixCommand 8001先从自身找问题 设置自身调用超时时间的峰值,峰值内可以正常运行, 超过了需要有兜底的方法处理,作服务降级fallback 8001fallb ...

  5. Hystrix 服务降级和熔断

    Hystrix 服务降级和服务熔断 文章目录 Hystrix 服务降级和服务熔断 1.问题的提出 2.Hystrix 3.服务降级 3.1 服务降级实操 3.2 服务降级之客户端 3.3 总结 4.服 ...

  6. [Spring Cloud] Hystrix三大特性--降级,熔断,隔离

    ✨✨个人主页:沫洺的主页

  7. java B2B2C springmvc mybatis多租户电子商城系统(五):熔断监控Hystrix Dashboard和Turbine...

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

  8. Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?

    导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...

  9. springcloud(五):熔断监控Hystrix Dashboard和Turbine

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

最新文章

  1. 正确理解ThreadLocal
  2. linux cpu漏洞,【图片】为什么linux mint上cpu漏洞直到现在也没完全修复?_linux吧_百度贴吧...
  3. NBIOT 移远BC28模块+stm32开发板例程、教程(打通TCP、COAP协议)
  4. arm-linux-gnueabi和arm-linux-gnueabihf 的区别
  5. 开发指南专题十一:JEECG微云快速开发平台--基础用户权限
  6. Day08- team、iptables、firewall
  7. c语言兔子序列答案,C语言经典题目——兔子生兔子(示例代码)
  8. Why bugs don’t get fixed? 不是所有的Bug都要修复
  9. VC++实现禁止上网
  10. d3dx9_42.dll缺少
  11. ORACLE执行计划学习总结
  12. 关于“2021中国隧道与地下空间大会暨中国(城市)地下空间学会(筹)成立大会”的通知
  13. python3d动画效果_使用Matplotlib 3D实现三维波浪动画
  14. 开涛spring3(6.9) - AOP 之 6.9 代理机制
  15. c语言实现简单的24点游戏
  16. winform 学习笔记
  17. ubuntu下安装搜狗拼音输入法
  18. 跟着吉庆写文档(流程图) の 让“伊妹儿“帮你管理时间
  19. 苹果云服务icloud_苹果手机icloud手动备份和还原个人用户资料
  20. 自动驾驶算法的KPI指标(精确率、召回率及准确率)

热门文章

  1. logstash启动失败的问题追查
  2. 读书笔记-精准努力-认识自己抓住优势专注聚焦
  3. [附源码]SSM计算机毕业设计房屋中介管理系统JAVA
  4. matlab ncg,Matlab 线性规划实践
  5. Linux那些事儿之我是U盘(51)光荣属于苹果,属于诺基亚,属于摩托罗拉,属于索尼爱立信
  6. mysql安装最后一步出现问题的一种解决方法
  7. 编程读取SMBIOS指定Type信息
  8. 拉格朗日乘子法、极大似然估计、EM算法
  9. 始祖双碳新闻 | 2022年8月26日碳中和行业早知道
  10. 从一次视频号的购物体验说说,为什么不看好腾讯做电商