上一篇转载的文章主要讲了Hystrix的应用场景、基础组件概念以及从源码的角度阐述了基本应用。本篇文章主要借鉴官方文档介绍Hystrix的工作流程及断路器的原理,最后说一下与SpringCloud的简单集成。

点击图片进入我的博客

How it Works

先上一个官方的流程图:


这个图大概描述了Hystrix的工作流程:
按照图中绿色标识的步骤:
1、创建一个HystrixCommand或HystrixObservableCommand对象;
2、通过以下四种方法执行命令(前两种方法仅适用于简单HystrixCommand对象且不可用HystrixObservableCommand):

  • execute():阻塞的,返回从依赖项收到的单个响应(或在出现错误时抛出异常)
  • queue(): 非阻塞的,返回一个可以从依赖项中获取单个响应的方法的Future对象。
  • observe(): 订阅Observable表示来自依赖项的响应,并返回Observable复制该源的响应Observable
  • toObservable(): 返回一个Observable,如果订阅了,会执行Hystrix命令并发出其响应

3、如果为此请求设置了缓存,首先判断缓存是否是可用的(即是否可以从缓存得到本次请求的响应),如果可以得到则直接返回,得不到再走下一步。
4、判断断路器是否打开,如果打开了说明之前的请求失败了(或者说之前满足了断路器的打开条件,具体满足的开闭条件下一模块再说),则直接调用重写的fallback()函数;如果断路器未打开再到下一步。
5、判断与该command关联的线程池和队列(或信号量)是否已满,如果已经满了,则Hystrix不会执行该Command,直接调用fallback()返回;否则到下一步。
6、此时通过HystrixObservableCommand.construct()或HystrixCommand.run()执行目的方法调用对依赖项的请求,如果执行失败或超时则直接执行fallback()。
7、健康状况统计
Hystrix在执行过程中会记录断路器的成功,失败,拒绝和超时状态,Hystrix维护一个记录这些数据的计数器,计数器的数据决定断路器的开闭状态。
8、当命令失败时Hystrix都会尝试回退,一般情况下,如果实现了HystrixCommand.getFallback()会返回单个回退值,或者实现HystrixObservableCommand.resumeWithFallback()会发出一个或多个回退值的Observable。如果没有实现fallback方法或在执行fallback方法时抛出了异常,Hystrix仍然会返回一个Observable,但不会返回任何内容,并立即终止并发出onError通知。通过此onError通知,导致命令失败的异常被传回给调用者。
9、成功返回

断路器

还是先上一个官方给出的逻辑决策图,包括计数器如何决定断路器的开闭。

说明:
1、如果请求数达到了设置的请求阈值或者请求失败的比例超过了设置的比例,则断路器将从close状态转到open状态,这时所有的请求都会被阻止。
2、sleep一段时间后,下一个请求将被放过,这时断路器处于半开半闭状态,目的是为了验证一下后边的路是否通畅,如果请求失败,则断路器回到open状态;如果成功了则断路器切换到closed状态并且返回响应的结果。

图中下方描述了计数器维护的数据存储结构及工作原理:大概意思是它维护10个桶(bucket),每个桶中记录第i秒请求状态(success、failure、timeout、rejection)的数量,当新的一秒请求记录来的时候,计数器会丢掉时间最靠前的桶。

SpringCloud简单集成

这个比较简单,注册中心选用Eureka(Consul的可以自己去测),直接上代码

model-1:eureka-server

Application.java

@EnableEurekaServer
@SpringBootApplication
public class Application {public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(true).run(args);}
}

application.properties

spring.application.name=eureka-server
server.port=1001eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=falselogging.file=${spring.application.name}.log
model-2:eureka-consumer-ribbon-hystrix

Application.java

@EnableCircuitBreaker
@EnableDiscoveryClient
@SpringBootApplication
public class Application {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(true).run(args);}
}

DcController.java

@RestController
public class DcController {@AutowiredConsumerService consumerService;@GetMapping("/consumer")public String dc() {return consumerService.consumer();}@Serviceclass ConsumerService {@AutowiredRestTemplate restTemplate;@HystrixCommand(fallbackMethod = "fallback")public String consumer() {return restTemplate.getForObject("http://eureka-client/dc", String.class);}public String fallback() {return "fallbck";}}}

application.properties

spring.application.name=eureka-consumer-ribbon-hystrix
server.port=2101eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/logging.file=${spring.application.name}.log
model-3:eureka-client

Application.java

@EnableDiscoveryClient
@SpringBootApplication
public class Application {public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(true).run(args);}
}

DcController.java

@RestController
public class DcController {@AutowiredDiscoveryClient discoveryClient;@GetMapping("/dc")public String dc() {String services = "Services: " + discoveryClient.getServices();System.out.println(services);return services;}}

application.properties

spring.application.name=eureka-client
server.port=2001eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
#eureka.client.serviceUrl.defaultZone=http://peer1:1001/eureka/,http://peer2:1002/eureka/logging.file=${spring.application.name}.log

Hystrix官方文档:Netflix-Hystrix官方WIKI
更多SpringCloud基础教程访问:程序员DD老司机的SpringCloud教程

本文已在版权印备案,如需转载请访问版权印06630244

Hystrix流程分析及断路器工作原理相关推荐

  1. Spring Cloud Hystrix 源码系列:工作原理

    Hystrix 译为 "豪猪",豪猪的棘刺能保护自己不受天敌伤害,代表了强大的防御能力.Hystrix 基于 RxJava 进行实现,RxJava 是一种基于观察者模式的响应式编程 ...

  2. 面试官:你分析过mybatis工作原理吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 Mybatis工作原理也是面试的一大考点,必须要对其非常清晰,这样 ...

  3. mybatis返回null_面试官:你分析过mybatis工作原理吗?

    Mybatis工作原理也是面试的一大考点,必须要对其非常清晰,这样才能怼回去.本文建立在Spring+SpringMVC+Mybatis整合的项目之上. 我将其工作原理分为六个部分: 读取核心配置文件 ...

  4. springmvc工作流程详解_SpringMVC工作原理详解

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 先来看一下什么是 MVC 模式 MVC 是一种设计模式. MVC 的原理图如下: SpringMV ...

  5. 锁相环原理应用与计算机辅助分析,锁相环工作原理与应用

    锁相环是现代电子系统的基本模块之一.它通常用于多媒体,通信和许多其他应用程序.有两种不同类型的PLL - 线性和非线性.在现实世界中非线性设计是困难和复杂的,但线性控制理论在模拟PLL中是很好的建模的 ...

  6. 电影放映机0.8K服务器维修流程,电影放映机的工作原理

    经常去影院看电影时我们生活中不可或缺的娱乐,那么您对放电影的原理有所了解吗?下面佰佰安全网小编就来说说电影放映机的工作原理. 电影放映机是把影片上记录的影像和声音,配合银幕和扩音机等机械设备还原出来. ...

  7. Java Spring注解实现分析之@requestMapping工作原理

    Created by Wang, Jerry, last modified on Aug 22, 2016

  8. 变频器的工作原理及其电路分析

    变频器简单的说就是结合了变频技术和微电子技术研制出来的可以改变输入电源的频率得到另外一种频率电源输出的设备.其输入的电源就是我们工业上面使用的电源,一般都是电压和频率都固定不变的交流电(240v或者3 ...

  9. 数字营销分析工具Google Analytics(分析)工作原理

    数字营销需要数据分析工具来调整.考核KOL,我在上篇文章"新一代智能Google Analytics助力营销分析"中对Google Analytics新版工具做了使用说明.今天来聊 ...

最新文章

  1. uboot中添加hi35xx的GPIO设置
  2. 比特币多重签名机制使用篇
  3. golang bloom filter实现
  4. layui结合springboot上传图片
  5. 水题总结NYOJ74,1094,60,975,111,833
  6. 字符串类习题、面试题详解(第二篇)
  7. C#多线程学习1——多线程的相关概念
  8. C++控制台输出中文时乱码的解决方案
  9. 常用的一些集合工具类
  10. 电子/硬件工程师手册
  11. SpringBoot2.2.X整合ElasricSearch7.8
  12. CAD制图快捷键分享,制图之前的基本准备
  13. Go的WaitGroup源码分析
  14. CUDA C编程(三十)OpenACC的使用
  15. 红日安全 ATT&CK VulnStack靶场(三)
  16. error LINK2005: XXXX已经在 .obj 中定义
  17. 基于OSGi的企业级开发框架实践——发布和使用分布式OSGi服务
  18. Mesos/Omega/Borg(K8S)/Firemament对比
  19. vue控制台报错Duplicate keys detected:‘xxxx‘.This may canse an update error
  20. 奋斗吧,程序员——第五十三章 万里赴戎机,关山度若飞

热门文章

  1. iOS:UIScrollView、UITableView、UICollectionView顶部空白问题
  2. Android之实现QQ好友分组(ExpandableListView)
  3. IDEA WebStorm 常用插件推荐
  4. 《迅为开发板i.MX8MM 学习记录》——【MIPI篇】Linux 应用程序显示一张图片
  5. 有源低通滤波器 vs. 有源带通滤波器 vs. LC滤波器
  6. fultter项目运行报错,Android不兼容问题
  7. 电脑格式化后数据恢复软件EasyRecovery16
  8. 第一次更名为OpenInfra的“她”,给我们带来了哪些惊喜?
  9. C/C++商品销售管理系统[2023-01-18]
  10. oracle sql 转换成 db2 sql