一、Hystrix介绍
在微服务架构中,我们可能将系统拆分中多个服务单元,由于每个服务单元都运行在不同的进程中,他们彼此之间通过远程调用的方式执行,这样就有可能因为网络原因或者是依赖服务自身问题出现调用故障或延迟,而这些问题 会直接 导致调用方对外提供服务也出现延迟,若此时调用方的请求不断累加,最后会造成任务积压导致自身系统瘫痪。
针对上述问题,Spring Cloud Hystrix实现了断路器、线程隔离等一系列服务保护功能。Hystrix主要作用如下:
1)服务隔离和服务熔断
服务隔离:每次 接收到请求,都找一个单独的空间执行,这样你出了问题,就不会影响其他的业务。
服务熔断:发现某个服务不可用时,执行兜底方法,触发降级,返回我们预置的内容或异常。
2)服务降级、限流和快速失败。其实,服务降级和快速失败是差不多的意思。
3)请求合并和请求缓存
4)本身整合了对单体和集群的监控
二、Hystrix架构和处理流程解析
1、架构图
Hystrix整个工作流程概括如下:
1、创建HystrixCommand或HystrixObservableCommand对象,用于封装请求,并且在构造方法 中配置请求执行需要的参数;
2、执行命令,H ystrix提供了4种执行命令的方法,后面我们在介绍。
3、判断结果是否使用缓存响应请求,若启用了缓存,且缓存可用,直接使用缓存响应请求。Hystrix支持请求缓存, 但是需要用户 自定义启动。
4、判断断路器是否打开,如果打开了, 直接跳到第8步
5、判断线程池/队列/信号量是否占满,如果已经占满,直接跳转到8步
6、执行HystrixObservableCommand.construct()或HystrixCommand.run(),如果执行失败或者超时,跳转到第8步;否则走9步
7、计算 断路器的健康度
8、走Fallback处理逻辑
9、返回请求响应
三、Hyxstrix的 两种命令模式
Command会以隔离的形式完成run方法的调用,用在依赖的服务返回单个操作结果的时候。
ObservableCommand会使用当前 线程进行调用,用在依赖的服务返回多个操作结果的 时候。
命令模式,将来自客户端的请求封装成一个对象,从而让你可以使用不同的请求对客户端进行参数化。他可以被用于