hystrix(8) 插件
上一节讲到HystrixCommand的执行流程。
Hystrix内部将一些模块实现成了插件,并且提供了用户提供自己的实现,通过配置来替换插件。Hystrix提供了5个插件,分别为并发相关插件(HystrixConcurrencyStrategy)、事件通知插件(HystrixEventNotifier)、度量信息插件(HystrixMetricsPublisher)Properties配置插件(HystrixPropertiesStrategy)、插件HystrixCommand回调函数类(HystrixCommandExecutionHook)。

想要使用自定义的插件,需要实现相应接口,然后通过HystrixPlugins注册插件、或者通过配置配置自定义插件、或者将插件放在类路径。HystrixPlugins获取插件顺序:
1.HystrixPlugins 会使用通过register注册的实现类。
2.HystrixPlugins会去properties(HystrixDynamicProperties)配置下需找相应类型的实现类。
3.通过ServiceLoader获取相应类型的实现类。
4.使用默认实现类。
本质原理是,Hystrix内部通过接口方式编程,具体实现通过HystrixPlugins获取。HystrixPlugins会根据设定的顺序获取插件。
public HystrixCommandExecutionHook getCommandExecutionHook() {
//如果HystrixPlugins没有注册插件
if (commandExecutionHook.get() == null) {
//通过配置文件和查找类路径实现接口
Object impl = getPluginImplementation(HystrixCommandExecutionHook.class);
//如果没有实现自定义插件,使用默认插件
if (impl == null) {
commandExecutionHook.compareAndSet(null, HystrixCommandExecutionHookDefault.getInstance());
} else {
commandExecutionHook.compareAndSet(null, (HystrixCommandExecutionHook) impl);
}
}
return commandExecutionHook.get();
}
private <T> T getPluginImplementation(Class<T> pluginClass) {
T p = getPluginImplementationViaProperties(pluginClass, dynamicProperties);
if (p != null) return p;
return findService(pluginClass, classLoader);
}
private static <T> T getPluginImplementationViaProperties(Class<T> pluginClass, HystrixDynamicProperties dynamicProperties) {
String classSimpleName = pluginClass.getSimpleName();
String propertyName = "hystrix.plugin." + classSimpleName + ".implementation";
String implementingClass = dynamicProperties.getString(propertyName, null).get();
if (implementingClass != null) {
...
Class<?> cls = Class.forName(implementingClass);
cls = cls.asSubclass(pluginClass);
return (T) cls.newInstance();
...
} else {
return null;
}
}
private static <T> T findService(
Class<T> spi,
ClassLoader classLoader) throws ServiceConfigurationError {
ServiceLoader<T> sl = ServiceLoader.load(spi,
classLoader);
for (T s : sl) {
if (s != null)
return s;
}
return null;
}
HystrixEventNotifier
在HystrixCommand和HystrixObservableCommand执行过程中会触发一些事件,实现HystrixEventNotifier可以监听这些事件进行一些告警和数据收集。
| EMIT | 当发射一个返回数据时,发送该消息,HystrixCommand不会发送该消息 |
| SUCCESS | 当发射一个返回数据时,发送该消息。 |
| FAILURE | |
| TIMEOUT | 发生time out异常时,发送该类型消息 |
| BAD_REQUEST | 发生bad request异常时,发送该类型消息 |
| SHORT_CIRCUITED | 熔断异常时,发送该类型消息 |
| THREAD_POOL_REJECTED | 处理线程池拒绝异常时,发送该类型消息 |
| SEMAPHORE_REJECTED | 处理信号量拒绝异常时,发送该类型消息 |
| FALLBACK_EMIT | 当fallback发射一个返回数据时,发送该消息,HystrixCommand不会发送该消息 |
| FALLBACK_SUCCESS | 当fallback执行结束时,发送该消息。 |
| FALLBACK_FAILURE | 当fallback执行异常并且异常不为UnsupportedOperationException时,发送该消息。 |
| FALLBACK_REJECTION | 当fallback执行超过指定并发量被拒绝时,发送该消息。 |
| FALLBACK_MISSING | 当fallback执行异常并且异常为UnsupportedOperationException时,发送该消息。 |
| EXCEPTION_THROWN | 当执行命令或fallback出现异常时,发送该消息 |
| RESPONSE_FROM_CACHE | 从缓存中获取结果时,发送该类型消息 |
| CANCELLED | |
| COLLAPSED | 当创建一个新的批量执行命令时,发送该类型消息 |
HystrixCommandExecutionHook
在HystrixCommand和HystrixObservableCommand执行过程中会调用HystrixCommandExecutionHook的相应方法,通过实现HystrixCommandExecutionHook可以在HystrixCommand或HystrixObservableCommand执行期间的响应阶段进行回调。
| 方法 | 调用点 |
|---|---|
onStart |
HystrixInvokable执行前被调用 |
onEmit |
whenever the HystrixInvokable emits a value |
onError |
if the HystrixInvokable fails with an exception |
onSuccess |
iHystrixInvokable执行成功 |
onThreadStart |
at the start of thread execution if the HystrixInvokable is a HystrixCommand executed using the THREADExecutionIsolationStrategy |
onThreadComplete |
at the completion of thread execution if the HystrixInvokable is a HystrixCommand executed using the THREAD ExecutionIsolationStrategy |
onExecutionStart |
when the user-defined execution method in the HystrixInvokable begins |
onExecutionEmit |
whenever the user-defined execution method in the HystrixInvokable emits a value |
onExecutionError |
when the user-defined execution method in the HystrixInvokable fails with an exception |
onExecutionSuccess |
when the user-defined execution method in the HystrixInvokable completes successfully |
onFallbackStart |
if the HystrixInvokable attempts to call the fallback method |
onFallbackEmit |
whenever the fallback method in the HystrixInvokableemits a value |
onFallbackError |
if the fallback method in the HystrixInvokable fails with an exception or does not exist when a call attempt is made |
onFallbackSuccess |
if the fallback method in the HystrixInvokable completes successfully |
onCacheHit |
if the response to the HystrixInvokable is found in the HystrixRequestCache |
onUnsubscribe |
Metrics发布
通过实现HystrixMetricsPublisher可以获取所有实例的metrics信息,这样我们就可以获取和存储这些metrics信息,以便后续处理。默认的实现不会发布这些metrics信息。
在创建AbstractCommand,HystrixThreadPoolDefault,HystrixObservableCollapser时分别会通过HystrixPlugins获取HystrixMetricsPublisherCommand,HystrixMetricsPublisherThreadPool,HystrixMetricsPublisherCollapser并初始化。
protected AbstractCommand(HystrixCommandGroupKey group, HystrixCommandKey key, HystrixThreadPoolKey threadPoolKey, HystrixCircuitBreaker circuitBreaker, HystrixThreadPool threadPool,
HystrixCommandProperties.Setter commandPropertiesDefaults, HystrixThreadPoolProperties.Setter threadPoolPropertiesDefaults,
HystrixCommandMetrics metrics, TryableSemaphore fallbackSemaphore, TryableSemaphore executionSemaphore,
HystrixPropertiesStrategy propertiesStrategy, HystrixCommandExecutionHook executionHook) {
...
HystrixMetricsPublisherFactory.createOrRetrievePublisherForCommand(this.commandKey, this.commandGroup, this.metrics, this.circuitBreaker, this.properties);
...
}
public HystrixThreadPoolDefault(HystrixThreadPoolKey threadPoolKey, HystrixThreadPoolProperties.Setter propertiesDefaults) {
this.properties = HystrixPropertiesFactory.getThreadPoolProperties(threadPoolKey, propertiesDefaults);
...
HystrixMetricsPublisherFactory.createOrRetrievePublisherForThreadPool(threadPoolKey, this.metrics, this.properties);
}
HystrixObservableCollapser(HystrixCollapserKey collapserKey, Scope scope, CollapserTimer timer, HystrixCollapserProperties.Setter propertiesBuilder, HystrixCollapserMetrics metrics) {
... HystrixMetricsPublisherFactory.createOrRetrievePublisherForCollapser(collapserKey, this.metrics, properties);
...
}
配置策略
配置策略的作用是提供Hystrix配置信息。
在创建AbstractCommand,HystrixThreadPoolDefault,HystrixObservableCollapser时分别会通过HystrixPropertiesStrategy获取HystrixCommandProperties,HystrixThreadPoolProperties,HystrixCollapserProperties并初始化。
private static HystrixCommandProperties initCommandProperties(HystrixCommandKey commandKey, HystrixPropertiesStrategy propertiesStrategy, HystrixCommandProperties.Setter commandPropertiesDefaults) {
if (propertiesStrategy == null) {
return HystrixPropertiesFactory.getCommandProperties(commandKey, commandPropertiesDefaults);
} else {
// used for unit testing
return propertiesStrategy.getCommandProperties(commandKey, commandPropertiesDefaults);
}
}
public HystrixThreadPoolDefault(HystrixThreadPoolKey threadPoolKey, HystrixThreadPoolProperties.Setter propertiesDefaults) {
this.properties = HystrixPropertiesFactory.getThreadPoolProperties(threadPoolKey, propertiesDefaults);
...
}
HystrixObservableCollapser(HystrixCollapserKey collapserKey, Scope scope, CollapserTimer timer, HystrixCollapserProperties.Setter propertiesBuilder, HystrixCollapserMetrics metrics) {
...
HystrixCollapserProperties properties = HystrixPropertiesFactory.getCollapserProperties(collapserKey, propertiesBuilder);
...
}
并发策略
并发策略可以让用户自定义实现线程池、请求作用域、Callable。
hystrix(8) 插件的更多相关文章
- 使用Hystrix的插件机制,解决在使用线程隔离时,threadlocal的传递问题
背景 在我们的项目中,比较广泛地使用了ThreadLocal,比如,在filter层,根据token,取到用户信息后,就会放到一个ThreadLocal变量中:在后续的业务处理中,就会直接从当前线程, ...
- hystrix文档翻译之插件
插件 可以通过实现插件来改变Hystrix的行为.可以通过HystrixPlugins来注册自定义插件,这些插件会被应用到HystrixCommand,HystrixObservableCommand ...
- hystrix源码之插件
HystrixPlugins 获取并发相关类(HystrixConcurrencyStrategy).事件通知类(HystrixEventNotifier).度量信息类(HystrixMetricsP ...
- Spring Cloud入门教程-Hystrix断路器实现容错和降级
简介 Spring cloud提供了Hystrix容错库用以在服务不可用时,对配置了断路器的方法实行降级策略,临时调用备用方法.这篇文章将创建一个产品微服务,注册到eureka服务注册中心,然后我们使 ...
- spring cloud: Hystrix(三):健康指数 health Indicator
spring cloud: Hystrix(三):健康指数 health Indicator ribbon+hystrix 当使用Hystrix时(spring-cloud-starter-hystr ...
- 服务容错保护断路器Hystrix之四:断路器监控(Hystrix Dashboard)-turbine集群监控
turbine 英[ˈtɜ:baɪn] n. 汽轮机; 涡轮机; 透平机; OK,上文我们看了一个监控单体应用的例子,在实际应用中,我们要监控的应用往往是一个集群,这个时候我们就得采取Turbine集 ...
- 服务容错保护断路器Hystrix之三:断路器监控(Hystrix Dashboard)-单体监控
turbine:英 [ˈtɜ:baɪn] 美 [ˈtɜ:rbaɪn] n.汽轮机;涡轮机;透平机 一.Hystrix Dashboard简介 在微服务架构中为了保证程序的可用性,防止程序出错导致网络阻 ...
- 服务容错保护断路器Hystrix之二:Hystrix工作流程解析
一.总运行流程 当你发出请求后,hystrix是这么运行的 红圈 :Hystrix 命令执行失败,执行回退逻辑.也就是大家经常在文章中看到的“服务降级”. 绿圈 :四种情况会触发失败回退逻辑( fal ...
- 服务容错保护断路器Hystrix之一:入门示例介绍(springcloud引入Hystrix的两种方式)
限流知识<高可用服务设计之二:Rate limiting 限流与降级> 在微服务架构中,我们将系统拆分成了一个个的服务单元,各单元间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的 ...
随机推荐
- Gulp的安装及用法
1.安装淘宝镜像 npm install cnpm -g --registry=https://registry.npm.taobao.org cnpm -v 2.生成项目描述文件 package.j ...
- JDBC | 第一章: 快速开始使用JDBC连接Mysql数据库?
开始使用基于java的JDBC技术来连接mysql进行msyql数据库简单的CRUD操作 下载对应mysql驱动包 这里我创建maven项目基于maven下载 <!--mysql 驱动--> ...
- Jmeter 常用函数(5)- 详解 __property
如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 读取 Jmeter 属性 语法格式 $ ...
- C++ Templates (1.2 模板实参推断 Template Argument Deduction)
返回完整目录 目录 1.2 模板实参推断 Template Argument Deduction 1.2 模板实参推断 Template Argument Deduction 当调用函数模板(如max ...
- vimrc备份
备份一下我的 gvim 配置文件 " 使vimrc文件立马生效 autocmd BufWritePost $MYVIMRC source $MYVIMRC " 设置自己的Leade ...
- 企业站做seo用什么程序好
http://www.wocaoseo.com/thread-306-1-1.html 随着互联网的兴起,越来越多的人通过网络来了解自已想了解的资讯,网络营销已经慢慢的取代了传统的营销模式.很多企业现 ...
- Oracle数据库的文件以及Oracle体系架构
第一部分.Oracle数据库的文件 1.参数文件:控制实例的行为的参数的集合 参数文件的作用 设定数据库的限制 设置用户或者进程的限制 设定数据库资源的限制 调整系统的性能 主要的参数文件 SGA_T ...
- 如何用CMake构建Android C++库
https://fireflytech.org/2017/11/04/compiling-cc-libraries-for-android/ https://blog.csdn.net/xhp2014 ...
- 深入了解Netty【三】Netty概述
1.简介 Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. Netty是一个NIO客户端服务器框架,它支持快速.简单地开发协议服务器和客户端等网络应用程序 ...
- [BUUOJ记录] [ACTF2020 新生赛]BackupFile、Exec
两道题都比较简单,所以放到一块记下来吧,不是水博客,师傅们轻点打 BackupFile 题目提示“Try to find out source file!”,访问备份文件/index.php.bak获 ...