SpringCloud学习笔记(12)----Spring Cloud Netflix之Hystrix断路器的流程和原理
工作流程(参考:https://github.com/Netflix/Hystrix/wiki/How-it-Works)
1、 创建一个HystrixCommand或HystrixObservableCommand实例
第一步就是构建一个HystrixCommand或HystrixObservableCommand实例来向其他的组件发出操作请求,通过构造方法创建实例。
HystrixCommand:返回一个单响应
HystrixObservableCommand: 返回一个观察者发出的响应
2. 这里 有 4个 方法,前两只适用于HystrixCommand不适用于HystrixObservableCommand
execute():阻塞型方法,返回单个结果(或抛出异常)
queue(): 异步方法,返回一个Future对象,可以从中取出单个结果(或抛出异常)
observe(): 返回Observable对象
toObserve(): 返回Observable对象
3. 缓存判断
检查缓存内是否有对应指令的结果,如果有的话,将缓存的结果直接以Observable对象形式返回。
4. 断路器判断
检查 Circuit Breakerr的状态如果 Circuit Breaker的状态为开启 Hystrix将不会执行对应指令,而是直接进入失败处理状态(图中 8)。如果Circuit Breaker的状态为关闭,Hystrix会继续执行(图 5)
5. 线程池、任务队列、信号量的检查
确认是否有足够的资源执行操作指令。当线程池和队列(或者是信号量不使用隔离模式的时候 资源满的时候 ,Hystrix将不会执行对应指令并且会直接进入失败处理状态 (图 8)
6. HystrixObservableCommand.construct()和HystrixCommand.run()
如果资源充足,Hystrix将会执行操作指令,操作指令的调用最终都会到这两个方法:
HystrixCommand.run():返回一个响应或者抛出一个异常。
HystrixObservableCommand.construct(): 返回一个可观测的发出响应(s)或发送一个onError通知
如果执行指令的时间超时,执行线程会抛出TimeException异常。Hystrix会抛弃结果并直接进入失败状态。如果执行指令成功,Hystrix会进行一系列的数据记录,然后返回执行的结果。
7. 统计断路器的健康情况
Hystrix会根据记录的数据来计算失败比率,一旦失败比率达到某一阀值将自动开启Circuit Breaker
8. 回退
如果我们再Command中实现了HystrixCommand..getFallback方法(或HystrixObservableCommand.resumeWithFallback())方法,Hystrix会返回对应方法的结果,如果没有实现这些方法,Hystrix仍然会返回一个空的Observable对象,并且可以通过onError来终止并处理错误。
调用不同的方法放回不同的结果:
execute(): 将会抛出异常
queue(): 将会返回一个Future对象,如果调用它的get()方法将会抛出异常。
observe()和toObservable():都会返回上述的Observable对象
9. 返回成功
如果Hystrix执行成功,返回的响应取决于在步骤2中调用命令。
execute():阻塞型方法,返回单个结果(或抛出异常)
queue(): 异步方法,返回一个Future对象,可以从中取出单个结果(或抛出异常)
observe(): 返回Observable对象
toObserve(): 返回Observable对象
断路器工作原理

断路器开启或者关闭的条件:
1、 当满足一定的阀值时候 (默认 10 秒内 超过 20 个请求 次数 )
2、 当失败率达到一定的时候( 默认 10 秒内超过 秒内超过 50%50%50%的请求失败 )
3、 到达以上阀值 ,断路器将会开启
4、 当开启的时候 ,所有请求 都不会进行转发
5、 一段时间之后( 默认是 5秒),这个时候断路器是半开状态, 会让其中一请求进行转发。如果成功断路器会关闭,若失败继续开启。重复 4和 5。
HystrixCircuitBreaker接口

SpringCloud学习笔记(12)----Spring Cloud Netflix之Hystrix断路器的流程和原理的更多相关文章
- SpringCloud学习笔记(13)----Spring Cloud Netflix之Hystrix断路器的隔离策略
说明 : 1.Hystrix通过舱壁模式来隔离限制依赖的并发量和阻塞扩散 2. Hystrix提供了两种隔离策略:线程池(THREAD)和信号量隔离SEMAPHORE). 1. 线程池隔离(默认策略模 ...
- SpringCloud学习笔记(11)----Spring Cloud Netflix之Hystrix断路器的使用
为什么会有断路器? 在微服务架构中,系 是拆分成 一个的服务单元各间通过注册与发现 的方式互相依 赖.每个单元都在不同的进程中运行, 都是通过远程调用的方式进行信 ,这样就有可能因为网络原或 是依赖服 ...
- Spring Cloud入门教程-Hystrix断路器实现容错和降级
简介 Spring cloud提供了Hystrix容错库用以在服务不可用时,对配置了断路器的方法实行降级策略,临时调用备用方法.这篇文章将创建一个产品微服务,注册到eureka服务注册中心,然后我们使 ...
- springCloud学习-消息总线(Spring Cloud Bus)
1.简介 Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来.它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控.本文要讲述的是用Spring Cloud Bus实现 ...
- Spring Cloud(Dalston.SR5)--Hystrix 断路器
Spring Cloud 对 Hystrix 进行了封装,使用 Hystrix 是通过 @HystrixCommand 注解来使用的,被 @HystrixCommand 注解标注的方法,会使用 Asp ...
- Spring Cloud(Dalston.SR5)--Hystrix 断路器-缓存
在 Spring Cloud 中可以使用注解的方式来支持 Hystrix 的缓存,缓存与合并请求功能需要先初始化请求上下文才能实现,因此,必须实现 javax.servlet.Filter 用于创建和 ...
- Spring Cloud(Dalston.SR5)--Hystrix 断路器-合并请求
在 Spring Cloud 中可以使用注解的方式来支持 Hystrix 的合并请求,缓存与合并请求功能需要先初始化请求上下文才能实现,因此,必须实现 javax.servlet.Filter 用于创 ...
- SpringCloud学习笔记(16)----Spring Cloud Netflix之Hystrix Dashboard+Turbine集群监控
前言: 上一节中,我们使用Hystrix Dashboard,只能看到单个应用内的服务信息.在生产环境中,我们经常是集群状态,所以我们需要用到Turbine这一应用. 作用:汇总系统内的多个服务的数据 ...
- SpringCloud学习笔记(14)----Spring Cloud Netflix之Hystrix对Feign的支持
1. Hystrix对Feign的支持 添加Feign中IUserBiz的实现类HystrixFallBack: package com.wangx.cloud.springcloud02consum ...
随机推荐
- 洛谷P4016 负载平衡问题(最小费用最大流)
题目描述 GG 公司有 nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入输出格式 输入格 ...
- 性能优化实战-join与where条件执行顺序
昨天经历了一场非常痛苦的性能调优过程,但是收获也是刻骨铭心的,感觉对sql引擎的原理有了进一步认识. 问题起源于测试人员测一个多条件检索的性能时,发现按某个条件查询会特别慢.对应的sql语句简化为: ...
- Python更换pip源,更换conda源
更换pip源: 1.在windows文件管理器中,输入 %APPDATA% 2.在该目录下新建pip文件夹,然后到pip文件夹里面去新建个pip.ini文件 3.在新建的pip.ini文件中输入以下内 ...
- mongodb主从搭建
#tigergao 官网进行下包,可以下载源码包或者二进制包,本次下载的为二进制包,进行试验. 主服务器搭建: mkdir mongomaster cp mongodb-linux-x86_64-rh ...
- spring使用注解开发
1.准备工作(1)导入common-annotations.jar(2)导入schema文件 文件名为spring-context-2.5.xsd(3)在xml的beans节点中配置 service层 ...
- Pyhton学习——Day51
model(数据库模型)------ORM----- 表与表之间的关系(两张表) 一对多 多对多 一对一 ORM------object relation mapping python的类 class ...
- easyUI datagrid的合并的js封装
$.extend($.fn.datagrid.methods, { autoMergeCells : function (jq, fields) { return jq.each(function ( ...
- Django中模块的加载原理
Django中的module的加载是通过反射来完成的,借助importlib中的import_module函数来实现的动态加载.import_module的内部通过使用了递归和线程锁,字符串的切割,实 ...
- zTree -- jQuery 树插件实现点击文字展开子节点
新版本的zTree是单击+号展开子项,点击文字选中该项,双击文字展开子项 项目用的是3.5版本的,如果要点击文字展开子项暂时没查到资料,自己琢磨了下 项目用的是jquery.ztree.core-3. ...
- Centos 6/7 忘记root密码处理方法
1. centos 6.x 重置root密码 开机按esc 到下图 按 e 键进入编辑模式,通常选择第二项后按 e 键编辑此项 进入该编辑模式后,在quiet后面输入 simple 或者 1 然后回 ...