在一个复杂的分布式应用中,一定会存在非常多的依赖,每一个依赖不可避免的总会存在调用失败的情况
如上图所示,假若依赖I出现问题,用户的请求失败。另外在高并发的场景下,不仅仅是服务调用失败,更有可能导致队列、线程等等其他系统资源被占用,进而引发级联错误
更要命的是如果依赖I是一个非核心业务,其余的是核心的,这种阻塞是不值当的
hystrix的目标
- 对需要调用依赖服务而产生的失败和时延做控制,保护链路
- 阻止复杂分布式系统中级联错误的产生
- 能够快速失败(比如超时设置)同时迅速从错误中恢复
- 可降级的时候,优雅的执行降级方法
- 能够做实时监控、提醒和选择性的控制
hystrix 使用方式
-
新建1个自己的“命令类”,它继承 HystrixCommand,用来“包装”最终要掉依赖的方法
class DefaultSettingCommand extends HystrixCommand<String> 复制代码
-
在
DefaultSettingCommand
中实现 hystrix 的声明周期的一些方法,包括当前命令的配置、指定run方法以及fallback方法-
配置:主要包括两大块线程池配置和命令执行的配置 。
配置信息详解戳这里
//构造函数中指定配置,线程池包括最大线程数等,命令配置包括超时时间等 super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("defaultCommand")) .andCommandPropertiesDefaults(Setting.DEFAULT_PROPERTIES_SETTER) .andThreadPoolPropertiesDefaults(Setting.DEFAULT_THREAD_SETTER)); 复制代码
- run方法:指定要执行远程调用的方法
- fallback:当run执行失败或者达到用户自己配置的情况,需要执行的备选方法
-
配置:主要包括两大块线程池配置和命令执行的配置 。
配置信息详解戳这里
-
在目标方法执行的地方,改为每次使用新建的命令来执行
//logicService即原本打算要执行的方法,在这里word是logicService执行方法时的参数 DefaultSettingCommand defaultCommand = new DefaultSettingCommand(logicService,word); defaultCommand.execute(); 复制代码
另一种使用 Hystrix 的方式是继承 HystrixObservableCommand ,不过使用它之前需要对 rxjava1 略微了解, HystrixObservableCommand感兴趣的同学可以戳这里
怎么对Hystrix做监控
-
使用HystrixDashboardStream。HystrixDashboardStream的实现就是按一定的时间间隔固定的去轮询所有自己存储的指标,用户可以选择自己感兴趣的数据做持久化