首页 > 其他分享 >Hystrix原理分析

Hystrix原理分析

时间:2022-12-14 15:56:15浏览次数:43  
标签:分析 返回 Hystrix Observable 对象 命令 原理 方法

通过上面两节我们了解了Hystrix的基本使用,下面我们将通过Hystrix官方的工作流程(如图所示)来解析Hystrix是怎样实现服务熔断】

 

 

图中执行的步骤如下: ① 创建一个HystrixCommand或者HystrixObservableCommand对象。 先通过调用HystrixCommand或HystrixObservableCommand类的构造方法,将依赖项的参数传递进去并创建HystrixCommand或HystrixObservableCommand对象,其内部使用了“命令模式”对外部依赖访问逻辑进行了封装。这两个对象的区别在于当依赖服务返回的结果是单个结果就用HystrixCommand,而HystrixObservableCommand返回的是多个结果。 ② 执行命令。 创建对象之后,会调用封装命令的方法执行命令。从图13-6中可以看到总共有4种命令方法。其中HystrixCommand类中封装了两种命令方法。 execute():采用同步阻塞的方式从依赖请求中获取单一的结果对象,出错时将抛出异常 queue():返回一个包含获取单一结果对象的Future对象。 HystrixObservableCommand类中封装了另外两种命令方法,并且使用了观察者-订阅者模式实现 observe():订阅一个从依赖请求中返回的代表响应的Observable对象 toObservable():同样返回一个Observable对象,只有当订阅它的时候才会执行Hystrix命令并返回结果。

 

③ 检查返回结果是否被缓存。 如果命令的请求缓存已经开启,并且当前请求的结果已经存在于缓存中,那么会立即返回一个包含缓存响应的Observable对象。

 

④ 检查断路器是否被打开。 当命令的请求结果没有缓存的时候,Hystrix会检查断路器是否被打开。如果断路器已被打开,那么Hystrix命令就不会执行,而是跳转到图13-6中的第8步获取fallback方法并执行fallback逻辑进行服务降级;如果断路器没有被打开,将跳转到图13-6中的第5步,检查是否有可用资源来执行命令。

 

⑤ 检查线程池、信号量、队列是否已满。 如果检查到与当前命令相关的线程池、信号量或队列已经满了,那么Hystrix命令就不会执行,而是跳转到图13-6中的第8步获取fallback方法并执行fallback逻辑进行服务降级。

 

⑥ 检查执行construct()或者run()方法。

Hystrix通过我们写方法的逻辑来决定请求依赖服务的时候使用哪个类的方法,如果我们请求返回的是单一结果,就执行run()方法,如果出错则抛出异常;如果我们请求返回的是多个结果,就执行construct()方法,并将返回的结果存放到Observable对象中或者调用onError()方法发送错误通知。

如果run()或者construct()方法的执行时间大于命令所设置的超时时间,那么该线程将会抛出TimeoutException异常,这种情况下,Hystrix将会跳转到图13-6中的第8步,进行fallback服务降级处理。

同时,如果run()或者construct()方法没有被取消或者中断,则会忽略run()或者construct()方法的返回结果。

如果命令没有抛出异常并返回了结果,那么Hystrix在返回结果后会执行一些日志和指标的上报。

如果调用run()方法,那么Hystrix会返回一个Observable对象,该Observable对象会发射单个结果并且会调用onCompleted方法来通知请求结束;如果调用construct()方法,那么Hystrix会将请求响应的结果放到Observable对象中并返回。

 

⑦ 计算断路器的健康指标。

Hystrix会报告“成功”“失败”“拒绝”“超时”等信息给断路器,断路器包含一系列的滑动窗口数据,并通过该数据进行统计。

Hystrix会根据这些统计的数据进行分析来决定是否需要进行熔断,如果需要熔断,那么在一段时间内将不再进行请求;如果熔断时间段已过但是根据统计数据发现还是未达到健康指标,那么再次进行熔断处理。

⑧ 进行fallback服务降级处理。 如果命令最终执行失败,Hystrix就会尝试执行自定义的fallback服务降级逻辑处理。以下情况可以导致fallback服务降级处理。

第4步中,当断路器打开而命令执行处于熔断状态的时候。

第5步中,当执行命令的线程池、信号量或队列已满的时候。

第6步中,当执行run()或者construct()方法的时候抛出了异常。 当命令执行超时的时候。

 

在进行fallback服务降级处理的时候,需要我们自己写一个通用的返回结果,并且该返回结果只能是一些静态的或者从缓存中获取的结果。

如果我们自己没有实现fallback方法处理,那么当命令抛出异常时,Hystrix仍然会返回一个Observable对象,但是这个对象没有任何返回结果,并且Hystrix会立即终止并调用onError方法发送错误通知,通过onError方法发送的通知可以将造成该命令抛出异常的原因返回给服务调用者。

⑨ 返回成功的响应。 当Hystrix命令执行成功后,它将以Observable对象返回结果给服务调用者,根据在第2步的调用方式的不同,在返回Observable对象之前可能会做一些转换。

 

如图所示。我们来解释一下图中的几个命令处理。

execute():通过queue()方法来获取一个Future对象,然后调用get()方法来获取Future对象中包含的值。

queue():将toObservable()方法返回的Observable对象通过toBlocking()方法转换成BlockingObservable对象,并通过toFuture()方法返回对应的Future对象。

observe():在toObservable()方法产生原始的Observable对象后立即订阅它,然后让命令马上开始进行异步执行并返回一个新的Observable对象,当调用该对象的subscribe()方法时将重新产生结果并通过订阅模式通知订阅者。

toObservable():返回一个没有改变的Observable对象,必须订阅它,它才能够开始执行命令的逻辑。

标签:分析,返回,Hystrix,Observable,对象,命令,原理,方法
From: https://www.cnblogs.com/cnetsa/p/16982392.html

相关文章

  • 服务熔断器Hystrix
    了解服务雪崩效应产生的原因和应对的策略。熟悉Hystrix的使用及其工作原理。熟悉如何在Feign中使用Hystrix进行服务降级。熟悉HystrixDashboard和Turbine的使用。 ......
  • Java做UI自动化和app自动化中动态代理@FindBy的工作原理【杭州多测师_王sir】【杭州多
    Java做UI自动化和app自动化中动态代理@FindBy的工作原理一、背景简介由于Selenium框架采用PageObject设计模式让测试代码与被测页面对象代码分离,因而提供了不少很方便的注......
  • Ribbon工作原理
    之前我们在使用RestTemplate进行服务交互的时候,在其注入的bean上添加了@LoadBalanced注解,这样它就默认是使用Ribbon进行负载均衡处理。 但是RestTemplate是Spring提供的......
  • [pdf]2021年170套数学分析高等代数试题及其29个分类774页及做题版
    [pdf]2021年170套数学分析高等代数试题及其29个分类774页及做题版 ......
  • Chaos 测试下的若干 NebulaGraph Raft 问题分析
    Raft是一种广泛使用的分布式共识算法。NebulaGraph底层采用Raft算法实现metad和storaged的分布式功能。Raft算法使NebulaGraph中的metad和storaged能够集群......
  • BI财务分析工具能做好杜邦分析吗?
    杜邦分析很重要,也很难真的做好,那么,能实现数据驱动业务管理的BI数据分析工具能把杜邦分析做好吗?事实上,财务人员熟练地用BI做杜邦分析,轻松取数分析财务数据的情况在很多企业中......
  • flash 游戏分析 - 1
    游戏我们就以《猎人的生存日记》(OrionSandbox)这款游戏来分析。下载链接用FlashStart打开OrionSandbox1.swf我们需要反复进入游戏,可以先打开一次游戏,以此进行:文件\(......
  • SPEL注入流程分析及CTF中如何使用
    配置https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-spel-rce,导入maven依赖为了后期debug调试简便些,可以修改一下控制器修改后运......
  • CFQ 的问题分析一则(二)
    书接上文提到的两个方案。调整group_idle参数之前的思路是:调整group_idle参数,在idle时让queue和group空转,多等待下一个request一会儿。so,编写脚本,测试不同......
  • DNS服务器原理及搭建
    一、什么是域名、域名是什么从技术角度来说就是IP地址映射。域名(英语:DomainName),又称网域。是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于......