happymeng 2019-06-18
在一个复杂的分布式应用中,一定会存在非常多的依赖,每一个依赖不可避免的总会存在调用失败的情况
如上图所示,假若依赖I出现问题,用户的请求失败。另外在高并发的场景下,不仅仅是服务调用失败,更有可能导致队列、线程等等其他系统资源被占用,进而引发级联错误
更要命的是如果依赖I是一个非核心业务,其余的是核心的,这种阻塞是不值当的
hystrix的目标
hystrix 使用方式
class DefaultSettingCommand extends HystrixCommand<String> 复制代码
//构造函数中指定配置,线程池包括最大线程数等,命令配置包括超时时间等 super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("defaultCommand")) .andCommandPropertiesDefaults(Setting.DEFAULT_PROPERTIES_SETTER) .andThreadPoolPropertiesDefaults(Setting.DEFAULT_THREAD_SETTER)); 复制代码
//logicService即原本打算要执行的方法,在这里word是logicService执行方法时的参数 DefaultSettingCommand defaultCommand = new DefaultSettingCommand(logicService,word); defaultCommand.execute(); 复制代码
继承HystrixCommand完整可执行的实例请戳这里
另一种使用 Hystrix 的方式是继承 HystrixObservableCommand ,不过使用它之前需要对 rxjava1 略微了解,HystrixObservableCommand感兴趣的同学可以戳这里
怎么对Hystrix做监控
它实际上就是单机版的 hystrix-dashboard(hystrix自带的带图形化的架空) 的实现原理,只是无法做持久化,只能看实时的结果,感兴趣的同学可以先启动hystrix-dashboard 查看结果,然后再启动这个web服务,启动后按照web服务项目的README即可看到对应图形界面 。特别注意如果要使用它记得要自己做鉴权,官方说明戳这里
hystrix 实现原理
hystrix的业务逻辑如下
大致逻辑为如下
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。
end:如果你觉得本文对你有帮助的话,记得点赞转发,你的支持就是我更新动力。