1 hystrix是什么

  在分布式系统中,每个服务都可能会调用很多其他服务,被调用的那些服务就是依赖服务,有的时候某些依赖服务出现故障也是很正常的。

Hystrix 可以让我们在分布式系统中对服务间的调用进行控制,加入一些调用延迟或者依赖故障容错机制

Hystrix 通过将依赖服务进行资源隔离,进而阻止某个依赖服务出现故障时在整个系统所有的依赖服务调用中进行蔓延;同时Hystrix 还提供故障时的 fallback 降级机制。

总而言之,Hystrix 通过这些方法帮助我们提升分布式系统的可用性和稳定性。

2 hystrix可以干什么

  阻止任何一个依赖服务耗尽所有的资源,比如 tomcat 中的所有线程资源。

  避免请求排队和积压,采用限流和 fail fast 来控制故障。

  提供 fallback 降级机制来应对故障。

  使用资源隔离技术,比如 bulkhead(舱壁隔离技术)、swimlane(泳道技术)、circuit breaker(断路技术)来限制任何一个依赖服务的故障的影响。

  通过近实时的统计/监控/报警功能,来提高故障发现的速度。

  通过近实时的属性和配置热修改功能,来提高故障处理和恢复的速度。

  保护依赖服务调用的所有故障情况,而不仅仅只是网络故障情况

3 怎么使用hystrix

3.1、构建一个HystrixCommand或者HystrixObservableCommand
一个HystrixCommand或一个HystrixObservableCommand对象,代表了对某个依赖服务发起的一次请求或者调用
构造的时候,可以在构造函数中传入任何需要的参数
HystrixCommand主要用于仅仅会返回一个结果的调用
HystrixObservableCommand主要用于可能会返回多条结果的调用
HystrixCommand command = new HystrixCommand(arg1, arg2);
HystrixObservableCommand command = new HystrixObservableCommand(arg1, arg2);
3.2、调用command的执行方法
执行Command就可以发起一次对依赖服务的调用
要执行Command,需要在4个方法中选择其中的一个:execute(),queue(),observe(),toObservable()
其中execute()和queue()仅仅对HystrixCommand适用
execute():调用后直接block住,属于同步调用,直到依赖服务返回单条结果,或者抛出异常
queue():返回一个Future,属于异步调用,后面可以通过Future获取单条结果
observe():订阅一个Observable对象,Observable代表的是依赖服务返回的结果,获取到一个那个代表结果的Observable对象的拷贝对象
toObservable():返回一个Observable对象,如果我们订阅这个对象,就会执行command并且获取返回结果
K value = command.execute();
Future<K> fValue = command.queue();
Observable<K> ohValue = command.observe();
Observable<K> ocValue = command.toObservable();
execute()实际上会调用queue().get().queue(),接着会调用toObservable().toBlocking().toFuture()
也就是说,无论是哪种执行command的方式,最终都是依赖toObservable()去执行的
3.3、检查是否开启缓存
从这一步开始,进入我们的底层的运行原理啦,了解hysrix的一些更加高级的功能和特性
如果这个command开启了请求缓存,request cache,而且这个调用的结果在缓存中存在,那么直接从缓存中返回结果
3.4、检查是否开启了短路器
检查这个command对应的依赖服务是否开启了短路器
如果断路器被打开了,那么hystrix就不会执行这个command,而是直接去执行fallback降级机制
3.5、检查线程池/队列/semaphore是否已经满了
如果command对应的线程池/队列/semaphore已经满了,那么也不会执行command,而是直接去调用fallback降级机制
3.6、执行command
调用HystrixObservableCommand.construct()或HystrixCommand.run()来实际执行这个command
HystrixCommand.run()是返回一个单条结果,或者抛出一个异常
HystrixObservableCommand.construct()是返回一个Observable对象,可以获取多条结果
如果HystrixCommand.run()或HystrixObservableCommand.construct()的执行,超过了timeout时长的话,那么command所在的线程就会抛出一个TimeoutException
如果timeout了,也会去执行fallback降级机制,而且就不会管run()或construct()返回的值了
这里要注意的一点是,我们是不可能终止掉一个调用严重延迟的依赖服务的线程的,只能说给你抛出来一个TimeoutException,但是还是可能会因为严重延迟的调用线程占满整个线程池的
即使这个时候新来的流量都被限流了。。。
如果没有timeout的话,那么就会拿到一些调用依赖服务获取到的结果,然后hystrix会做一些logging记录和metric统计
3.7、短路健康检查
Hystrix会将每一个依赖服务的调用成功,失败,拒绝,超时,等事件,都会发送给circuit breaker断路器
短路器就会对调用成功/失败/拒绝/超时等事件的次数进行统计
短路器会根据这些统计次数来决定,是否要进行短路,如果打开了短路器,那么在一段时间内就会直接短路,然后如果在之后第一次检查发现调用成功了,就关闭断路器
3.8、调用fallback降级机制
在以下几种情况中,hystrix会调用fallback降级机制:run()或construct()抛出一个异常,短路器打开,线程池/队列/semaphore满了,command执行超时了
一般在降级机制中,都建议给出一些默认的返回值,比如静态的一些代码逻辑,或者从内存中的缓存中提取一些数据,尽量在这里不要再进行网络请求了
即使在降级中,一定要进行网络调用,也应该将那个调用放在一个HystrixCommand中,进行隔离
在HystrixCommand中,上线getFallback()方法,可以提供降级机制
在HystirxObservableCommand中,实现一个resumeWithFallback()方法,返回一个Observable对象,可以提供降级结果
如果fallback返回了结果,那么hystrix就会返回这个结果
对于HystrixCommand,会返回一个Observable对象,其中会发返回对应的结果
对于HystrixObservableCommand,会返回一个原始的Observable对象
如果没有实现fallback,或者是fallback抛出了异常,Hystrix会返回一个Observable,但是不会返回任何数据
不同的command执行方式,其fallback为空或者异常时的返回结果不同
对于execute(),直接抛出异常
对于queue(),返回一个Future,调用get()时抛出异常
对于observe(),返回一个Observable对象,但是调用subscribe()方法订阅它时,理解抛出调用者的onError方法
对于toObservable(),返回一个Observable对象,但是调用subscribe()方法订阅它时,理解抛出调用者的onError方法
3.9、不同的执行方式
execute(),获取一个Future.get(),然后拿到单个结果
queue(),返回一个Future
observer(),立即订阅Observable,然后启动8大执行步骤,返回一个拷贝的Observable,订阅时理解回调给你结果
toObservable(),返回一个原始的Observable,必须手动订阅才会去执行8大步骤

4 总结:

由上图对微服务技术进行了分析,可以知道dubbo服务并不是很好的做到这个,在很早的时候电商开发的时候就是采用这个进行解决的,对服务进行控制.但是相对于springcloud中使用起来更简单,

转载于:https://www.cnblogs.com/xiufengchen/p/10749719.html

用 Hystrix 构建高可用服务架构相关推荐

  1. Hystrix面试 - 用 Hystrix 构建高可用服务架构

    Hystrix面试 - 用 Hystrix 构建高可用服务架构 Hystrix 是什么? 在分布式系统中,每个服务都可能会调用很多其他服务,被调用的那些服务就是依赖服务,有的时候某些依赖服务出现故障也 ...

  2. 亿级流量电商详情页系统实战:缓存架构+高可用服务架构+微服务架构

    <缓存架构+高可用服务架构+微服务架构>深入讲解了亿级流量电商详情页系统的完整大型架构.同时最重要的是,在完全真实的大型电商详情页系统架构下,全流程实战了整套微服务架构,包含了基于领域驱动 ...

  3. 大型电商架构亿级流量电商详情页系统实战-缓存架构+高可用服务架构+微服务架构(七)

    文章目录 八十九.高并发场景下恐怖的缓存雪崩现象以及导致系统全盘崩溃的后果 九十.缓存雪崩的基于事前+事中+事后三个层次的完美解决方案 九十一.基于hystrix完成对redis访问的资源隔离以避免缓 ...

  4. .net core下简单构建高可用服务集群

    一说到集群服务相信对普通开发者来说肯定想到很复杂的事情,如zeekeeper ,反向代理服务网关等一系列的搭建和配置等等:总得来说需要有一定经验和规划的团队才能应用起来.在这文章里你能看到在.net ...

  5. 亿级流量电商详情页系统实战-38.hystrix与高可用系统架构:资源隔离+限流+熔断+降级+运维监控

    1.前言 前半部分,专注在高并发这一块,缓存架构,承载高并发,在各种高并发导致的令人崩溃/异常的场景下,运行着缓存架构,高可用性,在各种系统的各个地方有乱七八糟的异常和故障的情况下,整套缓存系统还能继 ...

  6. 构建高可用服务器之二 Keepalive参数详解

    keepalived有三类配置区域,注意不是三种配置文件,是一个配置文件里面三种不同类别的配置区域,全局配置(Global Configuration).VRRPD配置.LVS配置 ! Configu ...

  7. 构建高可用服务器之 Keepalive参数详解

    keepalived有三类配置区域,注意不是三种配置文件,是一个配置文件里面三种不同类别的配置区域, 全局配置(Global Configuration).VRRPD配置.LVS配置! Configu ...

  8. 亿级流量电商详情页系统实战(完整版):缓存架构+高可用服务架构+微服务架构(包含落地代码实操)

    链接:百度网盘 请输入提取码 提取码:l472 更多儒猿专栏~ 欢迎关注儒猿技术窝

  9. 综合架构-高可用服务

    综合架构-高可用服务 高可用服务介绍说明 高可用服务工作原理 如何实现部署高可用服务 高可用keepalived服务部署流程 高可用服务企业应用 高可用服务常见异常问题 ----脑裂问题 如何实现ke ...

最新文章

  1. Linux_Makefile模板
  2. Nat. Mach. Intell. | 深度神经网络中的捷径学习
  3. OpenStack 关闭安全组
  4. nagios监控远程端口
  5. override java field_JavaPoet 看这一篇就够了
  6. iOS 设备的网页调试工具-Firebug
  7. [转载] windows下Python2.7 的 pyOpenGL模块安装
  8. SQL Server 2005的Resource数据库
  9. CWM(Common warehouse metamodel)
  10. steamcommunity 302占用端口
  11. 计算机屏幕显示故障,计算机显示器常见故障的原因和解决方法
  12. matlab for 数组,Matlab数组
  13. learn python the hard way中文pdf_Learn Python 3 the Hard Way .pdf
  14. 论坛报名 | DataFunCon:用户画像论坛
  15. FutureTask实现超时任务
  16. 最近做的智能垃圾桶程序代码(1)
  17. React使用cra创建项目,开启装饰器
  18. android化学制图软件,化学工具箱最新版
  19. Window11 alt+tab键失效
  20. Linux操作系统实验1——地址转换

热门文章

  1. 简单图文配置golang+vscode【win10/centos7+golang helloworld+解决install failed等情况】
  2. 计算机如何表示色彩?
  3. 【Spring】银行转账案例
  4. 如何直观地理解「协方差矩阵」?
  5. Pytorch源码与运行原理浅析--网络篇(一)
  6. NVIDIA Jarvis:一个GPU加速对话人工智能应用的框架
  7. 2021年大数据HBase(二):HBase集群安装操作
  8. [JAVA EE]ajax 方式提交数据
  9. C++ 判断字符串是否为空
  10. python sys.argv[] 的作用