Hystrix 功能:
- 当所依赖的网络服务发生延迟或者失败时,对访问的客户端程序进行保护。
- 在分布式系统中,停止级联故障
- 网络服务恢复正常后,可以快速恢复客户端的访问能力
- 调用失败时,执行服务回退
- 支持实时监控、报警和其他操作。
先简单用示例看下 Hystrix 的作用
搭建一个简单的服务端接口,端口 8080
搭建客户端来调用
客户端先继承 HystrixComman 类
正常调用服务端
调用超时的服务
上面例子中我们使用了 HystrixCommand 的 execute 方法命令,除此外还有以下方法来执行命令:
- toObservable: 返回一个最原始的课观察的实例(Observable),Observable 是 RxJava 的类,使用该对象可以观察命令的执行过程,并且将执行的信息传递给订阅者。
- observe: 调用 toObservable 方法,获得一个原始的 Observable 实例,使用 ReplaySubject 作为原始 Observable 的订阅者。
- queue: 通过 toObservable 方法获取原始的 Observable 实例,再调用 Observable 的 toBlocking 方法得到一个 BlockingObservable 实例,最后调用 BlockingObservable 的 toFuture 方法返回 Future 实例,调用 Future 的 get 方法得到执行结果
- execute: 调用 queue 的 get 方法返回命令的执行结果,该方法同步执行。
以上 4 个方法,除 execute 方法外,其他方法均为异步执行.observe 与 toOBservable 方法的区别在于,toObservalbe 被调用后,命令不会立即执行,只有当返回的 Observable 实例被订阅后,才会真正执行命令。而 observe 方法的实现中,会调用 toObservable 得到的 Observable 实例,在对其进行订阅,因此调用 observ 方法后会立即执行命令(异步).
代码参考:
Hystrix 可以配置一些属性可以参考 https://github.com/Netflix/Hystrix/wiki/Configuration
关于回退需要注意的是,回退方法 A 中也可以触发另一个命令 B,如果 B 执行失败也会触发 B 回退
特殊的情况:
断路器开启需要满足两个条件:
- 整个链路达到一定阈值,默认情况下,10s 内产生超过 20 次请求,则符合第一个条件。
- 满足第一个条件的情况下,如果请求的错误百分比大于阈值,则会打开断路器,默认为 50%
断路器关闭
断路器打开后,在一段时间内,命令不会再执行(一直触发回退),这段时间我们称作"休眠期",休眠期默认为 5s,休眠期结束后,Hystrix 会尝试性地执行一次命令,此时断路器的状态不是开启,也不是关闭,而是一个半开的状态,如果这一次命令执行成功,则会关闭断路器并清空链路的健康信息; 如果执行失败,断路器会继续保持打开的状态。
隔离机制
命令真正执行除了要保证断路器关闭外,还需要判断执行命令的线程池或者信号量是否满载的情况,如果满载则不会执行,直接回退,这样的机制在控制命令的执行上,实现了错误的隔离,Hystrix 提供两种隔离策略:
- THREAD(线程)默认值,由线程池来决定命令的执行,如果线程池满载则不会执行命令.Hystrix 使用了 ThreadPoolExecutor 来控制线程池行为,线程池的默认大小为 10.
- SEMAPHORE(信号量):由信号量来决定命令的执行,当请求的并发数高于阈值时,就不在执行命令,相当于线程池策略,信号量策略开销更小,但是该策略不支持超时以及异步,除非对调用的服务有足够的信任,否则不建议使用该策略进行隔离。
测试线程池
测试信号量
请求合并
对于URL相同但是参数不同的请求,Hystrix提供了合并请求的功能,减少线程开销和网络连接,提高性能,有点像批处理功能。 实现合并请求功能,至少包含以下3个条件:
- 需要有一个执行请求的命令,将全部参数进行整理,然后调用外部服务。
- 需要有一个合并处理器,用于手机请求,以及处理结果。
- 外部接口提供支持,例如一个接口是根据姓名查询人员信息/person/{personName} ,另外服务端还提供批量查询/persons 用于查找多个 Person
这种情况,如果有多个请求单个 Person 的请求,就可以合并为一个批量查询进行处理。
请求缓存
Hystrix 支持缓存功能,一次请求过程中,多个地方调用同一个接口考虑使用缓存,缓存打开后下一次命令不会执行直接从缓存中获取响应;开启缓存较为简单在命令中重写父类的 getCacheKey 即可。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于