Hystrix 的执行流程可以概括为以下几个关键步骤:
-
命令创建:每次调用依赖服务时,首先会创建一个
HystrixCommand
(针对单一结果)或HystrixObservableCommand
(针对多个结果或异步操作)对象。这个对象封装了对依赖服务的具体调用逻辑,放在run()
方法中。 -
缓存检查(可选):在执行命令之前,Hystrix 会检查是否启用了请求缓存以及是否有可用的缓存结果。如果缓存命中,则直接返回缓存数据,跳过后续步骤。
-
断路器检查:接下来,Hystrix 会检查关联的断路器状态。如果断路器是打开的,表明之前的服务调用频繁失败,Hystrix 不会执行实际的命令,而是直接跳转到降级逻辑(
getFallback()
方法),提供一个回退响应。 -
资源可用性检查:如果断路器是关闭的,Hystrix 会检查是否有足够的资源(如线程池中的线程或信号量许可)来执行命令。如果资源不足(例如线程池满或信号量达到上限),也会触发降级逻辑,避免进一步加重系统负担。
-
命令执行:如果上述检查都通过,Hystrix 将执行
run()
方法中的业务逻辑。这可能是同步执行(通过execute()
方法),也可能是异步执行(通过queue()
或observe()
方法返回Future
或Observable
)。 -
结果处理:命令执行完毕后,其结果(成功或失败)会被记录,并更新断路器的状态(如增加成功或失败计数)。如果执行成功,结果将被返回给调用者;如果执行过程中发生错误,会触发错误处理逻辑。
-
降级处理(如适用):在断路器打开或资源不足的情况下,Hystrix 会执行
getFallback()
方法提供的降级逻辑,尝试提供一个替代响应。如果降级逻辑也失败,可能会返回一个默认的错误信息。 -
监控与指标收集:在整个执行过程中,Hystrix 会收集各种指标,包括成功率、失败率、延迟等,并可以通过 Hystrix Dashboard 进行可视化监控。
通过这一系列的步骤,Hystrix 实现了对依赖服务调用的隔离、熔断、降级和监控,提高了系统的稳定性和弹性。