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

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

内容简介:在一个复杂的分布式应用中,一定会存在非常多的依赖,每一个依赖不可避免的总会存在调用失败的情况如上图所示,假若依赖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。 源码跟踪戳这里 ,看源码过程中出现的 用法可以在这里找到单独案例


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

查看所有标签

猜你喜欢:

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

Cracking the Coding Interview

Cracking the Coding Interview

Gayle Laakmann McDowell / CareerCup / 2015-7-1 / USD 39.95

Cracking the Coding Interview, 6th Edition is here to help you through this process, teaching you what you need to know and enabling you to perform at your very best. I've coached and interviewed hund......一起来看看 《Cracking the Coding Interview》 这本书的介绍吧!

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

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具