一文入门分布式服务高容错优雅解决利器 Hystrix

栏目: 后端 · 发布时间: 4年前

内容简介:在一个复杂的分布式应用中,一定会存在非常多的依赖,每一个依赖不可避免的总会存在调用失败的情况如上图所示,假若依赖I出现问题,用户的请求失败。另外在高并发的场景下,不仅仅是服务调用失败,更有可能导致队列、线程等等其他系统资源被占用,进而引发级联错误更要命的是如果依赖I是一个非核心业务,其余的是核心的,这种阻塞是不值当的

在一个复杂的分布式应用中,一定会存在非常多的依赖,每一个依赖不可避免的总会存在调用失败的情况

一文入门分布式服务高容错优雅解决利器 Hystrix

如上图所示,假若依赖I出现问题,用户的请求失败。另外在高并发的场景下,不仅仅是服务调用失败,更有可能导致队列、线程等等其他系统资源被占用,进而引发级联错误

更要命的是如果依赖I是一个非核心业务,其余的是核心的,这种阻塞是不值当的

hystrix的目标

  • 对需要调用依赖服务而产生的失败和时延做控制,保护链路
  • 阻止复杂分布式系统中级联错误的产生
  • 能够快速失败(比如超时设置)同时迅速从错误中恢复
  • 可降级的时候,优雅的执行降级方法
  • 能够做实时监控、提醒和选择性的控制

hystrix 使用方式

  1. 新建1个自己的“命令类”,它继承 HystrixCommand,用来“包装”最终要掉依赖的方法
    class DefaultSettingCommand extends HystrixCommand<String>
    复制代码
  2. DefaultSettingCommand 中实现 hystrix 的声明周期的一些方法,包括当前命令的配置、指定run方法以及fallback方法
    • 配置:主要包括两大块线程池配置和命令执行的配置 。 配置信息详解戳这里
      //构造函数中指定配置,线程池包括最大线程数等,命令配置包括超时时间等
       super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("defaultCommand"))
          .andCommandPropertiesDefaults(Setting.DEFAULT_PROPERTIES_SETTER)
          .andThreadPoolPropertiesDefaults(Setting.DEFAULT_THREAD_SETTER));
      复制代码
    • run方法:指定要执行远程调用的方法
    • fallback:当run执行失败或者达到用户自己配置的情况,需要执行的备选方法
  3. 在目标方法执行的地方,改为每次使用新建的命令来执行
    //logicService即原本打算要执行的方法,在这里word是logicService执行方法时的参数
    DefaultSettingCommand defaultCommand = new DefaultSettingCommand(logicService,word);
            defaultCommand.execute();
    复制代码

继承HystrixCommand完整可执行的实例请戳这里

另一种使用 Hystrix 的方式是继承 HystrixObservableCommand ,不过使用它之前需要对 rxjava1 略微了解, HystrixObservableCommand感兴趣的同学可以戳这里

怎么对Hystrix做监控

  1. 使用HystrixDashboardStream。HystrixDashboardStream的实现就是按一定的时间间隔固定的去轮询所有自己存储的指标,用户可以选择自己感兴趣的数据做持久化

    它实际上就是单机版的 hystrix-dashboard(hystrix自带的带图形化的架空) 的实现原理,只是无法做持久化,只能看实时的结果, 感兴趣的同学可以先启动hystrix-dashboard 查看结果 ,然后再启动这个 web服务 ,启动后按照web服务项目的README即可看到对应图形界面 。 特别注意如果要使用它记得要自己做鉴权,官方说明戳这里

    一文入门分布式服务高容错优雅解决利器 Hystrix
  2. 利用Hystrix的Publisher机制,将自己实现的Publisher注册到HyStrix的插件中。 publisher可运行实例戳这里

hystrix 实现原理

hystrix的业务逻辑如下

一文入门分布式服务高容错优雅解决利器 Hystrix
  • 图中蓝色的实线表示调用路径
  • 蓝色的虚线表示实际调用的方法
  • 红色的实线表示返回的路径
  • 红色的虚线表示每次命令执行结果的数据搜集

大致逻辑为如下

  1. 调用HystrixCommand的方法,比如 execute()
  2. hystrix判断是否用了缓存,缓存命中就直接从缓存返回
  3. 根据之前搜集的指标,来判断断路器(circuit-breaker)是否开启,如果开启执行备用方法
  4. 断路器正常判断线程池是否发出拒绝信号,是就执行备用方法
  5. 执行用户自定义的方法
  6. 判断执行是否成功、是否超时。有问题就执行备用方法,否则正常返回

observe与toObservable

Observer是观察者,Observable表明是可以被观察的。

行人过红绿灯,行人是Observer,红绿灯的变化是可以Observable的。

toObservable就是将执行依赖方法转变成可以观察的,方便 Hystrix这个Observer 实现自己的业务逻辑

hystrix(1.5.x)底层是使用 rxjava1 实现的,感兴趣同学可以看下这个RxJava学习路径

circuit-breaker与short-circuit与fallback

想象一下大学寝室的电路(circuit),正在用个大功率的电磁炉煮火锅, 正常情况下,整个电路工作正常,但是由于使用了大功率电磁炉造成了短路(short-circuit),整个寝室的电路都废了,这个时候就需要执行备用(fallback)的计划了,比如打开手机拾到拾到出去吃。运气好电路没有短路,但是看到了电线蹦火星,赶紧去把电闸给关了,主动断开电路,这个关电闸的人就是 circuit-breaker。

如何决定要执行短路逻辑的?

Hystrix是根据RxJava1实现的,看源码前强烈建议看下这个RxJava学习路径

以HealthCounts计算为例。Hystrix底层依赖RxJava,通过RxJava的语义,实现将一个个的命令执行结果分成桶存储,然后每个桶又通过时间窗口的聚合,算出错误占比,然后在每次执行前判断错误占比是否是继续执行用户的 run/constructor方法还是 执行 getFallBack。 源码跟踪戳这里 ,看源码过程中出现的 用法可以在这里找到单独案例


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python深度学习

Python深度学习

[美] 弗朗索瓦•肖莱 / 张亮 / 人民邮电出版社 / 2018-8 / 119.00元

本书由Keras之父、现任Google人工智能研究员的弗朗索瓦•肖莱(François Chollet)执笔,详尽介绍了用Python和Keras进行深度学习的探索实践,涉及计算机视觉、自然语言处理、生成式模型等应用。书中包含30多个代码示例,步骤讲解详细透彻。由于本书立足于人工智能的可达性和大众化,读者无须具备机器学习相关背景知识即可展开阅读。在学习完本书后,读者将具备搭建自己的深度学习环境、建......一起来看看 《Python深度学习》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具