blog

Hystrix插件

可以通过实现插件来修改Hystrix行为,或者添加额外的操作。

可以通过HystrixPlugins方式注册插件。Hystrix 会将注册的插件应用到HystrixCommand,HystrixObservableCommand, 以及HystrixCollapser的实现中,覆盖其它所有的插件。

插件类型

详细参考Hystrix Javadoc文档

事件通知

HystrixCommandHystrixObservableCommand执行过程中发生的事件由HystrixEventNotifier触发来记录告警和统计收集。

度量发布

每一个被捕获的度量实例(例如所有给定HystrixCommandKeyHystrixCommands)都会查找HystrixMetricsPublisher的实现并进行初始化。

这样每一个实例都有机会接收度量数据对象并启动后端进程去用度量对象做一些操作,比如保存到持久层。

默认实现不做任何发布。

如果想要使用Servo,一个可以通过各种不同的机制接收数据(比如通过轮询器或JMX)的内存系统,请参考文档https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-servo-metrics-publisher

属性策略

如果你实现了HystrixPropertiesStrategy,你可以完全控制系统的属性定义。

默认实现使用了Archaius

并发策略

Hystrix使用了ThreadLocal,Callable,Runnable,ThreadPoolExecutor以及BlockingQueue的实现作为线程隔离和请求范围的功能。

默认情况下,Hystrix有默认的实现。但是很多情况下(包括Netflix)需要定制化,因此该插件允许注入自定义的实现或装饰行为。

可以实现HystrixConcurrencyStrategy以及如下方法:

命令执行钩子

HystrixCommandExecutionHook的实现让HystrixInvokable的生命周期能够被访问(HystrixCommandHystrixObservableCommand),这样就可以注入行为,日志,覆盖响应,修改线程状态等。可以通过覆盖下面的一个或多个钩子来实现:

HystrixCommandExecutionHook方法 Hystrix调用方法的时机
onStart HystrixInvokable开始执行前
onEmit HystrixInvokable产生一个值时
onError HystrixInvokable失败并抛出异常时
onSuccess HystrixInvokable成功完成时
onThreadStart HystrixInvokable是以线程隔离策略执行的HystrixCommand时,在线程启动时
onThreadComplete HystrixInvokable是以线程隔离策略执行的HystrixCommand时,在线程完成时
onExecutionStart 当在HystrixInvokable中的用户定义当方法开始执行时
onExecutionEmit 当在HystrixInvokable中的用户定义当方法产生一个值时
onExecutionError 当在HystrixInvokable中的用户定义的方法失败并抛出异常时
onExecutionSuccess 当在HystrixInvokable中的用户定义的方法池、成功完成时
onFallbackStart HystrixInvokable调用fallback方法时
onFallbackEmit HystrixInvokable中的fallback方法产生值时
onFallbackError HystrixInvokable中的方法调用失败并抛出异常时,或者当调用一个不存在的方法时
onFallbackSuccess HystrixInvokable中的fallback方法成功完成时
onCacheHit 当对HystrixInvokable的响应在HystrixRequestCache中找到时

如何使用

当第一次调用HystrixCommand时,首先访问插件管理的功能。因为不能在运行时包装插件,因此第一次HystrixCommand使用的插件变成了HystrixCommand在JVM运行过程中使用的插件。

如果在Archaius中注册了插件,则注册的插件会被使用,否则,Hystrix使用默认插件。插件使用示例地址

https://github.com/eirslett/pull-request-illustration

如果想在第一次调用HystrixCommand时注册插件,可以使用如下类似的代码。

HystrixPlugins.getInstance().registerEventNotifier(ACustomHystrixEventNotifierDefaultStrategy.getInstance());

参考

Hystrix Plugins