首页技术文章正文

Spring Cloud Hystrix原理详细介绍

更新时间:2020-11-19 来源:黑马程序员 浏览量:

1577370495235_学IT就到黑马程序员.gif

Spring Cloud中的Hystrix是Netflix开源的一款针对分布式系统延迟和容错的库,其目的是通过添加延迟容忍和容错逻辑,从而控制分布式服务之间的交互。

对于一个复杂的分布式系统,包含的应用可能多达数十个,这些应用有许多依赖项目,每个依赖项目在某个时刻不可避免会失败导致故障,如果不对这些故障进行隔离,整个分布式系统都可能会崩溃。

借助官网的一个例子来说明,假设某个应用程序依赖30多个服务,每个服务正常运行的概率是99.99%,那么系统可用的概率是99.9930=99.7%,也就是说,每个服务出现故障的概率是0.3%,十亿个请求的故障就是3000000个,即使所有依赖具有出色的正常运行时间,每个月至少会有2小时以上的服务是不可用的,现实情况中,情况可能会更糟糕。

当一切正常时,请求情况如下图所示。

1605782082620_一切正常的请求情况.jpg

一切正常的请求情况


当其中有一个系统有延迟时,它可能阻塞整个用户请求,具体如下图所示。

1605782114853_系统出现延迟的情况.jpg

系统出现延迟的情况

在高流量情况下,一个后端的依赖延迟可能会导致所有服务的资源在数秒内变的饱和,这也就意味着,后续如果再有请求将无法提供服务,应用会出现故障。比故障更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,从而备份队列、线程和其他资源,从而导致整个系统出现更多级联故障,如下图所示。

1605782137511_系统出现更多级联故障情况.jpg

系统出现更多级联故障情况

Hystrix的出现就是为了解决上述问题的,它封装了每个依赖项,每个依赖项彼此隔离,当延迟发生时,它会被限制在资源中,并包含回退逻辑,该逻辑决定在依赖发生任何类型故障时应作出何种响应。

使用Hystrix包装依赖项后,前面图中的架构会发生变化,如下图所示。

1605782159820_使用Hystrix包装依赖后的架构.jpg

使用Hystrix包装依赖后的架构

在上图中,Hystrix被设计的目标是阻止级联故障,对通过第三方客户端访问的依赖项的延迟和故障进行保护和控制。Hystrix实现这一目标的大致思路具体如下:

(1) 将外部依赖的访问请求封装在独立的线程中,进行资源隔离。

(2) 对于超出设定阈值的服务调用,直接进行超时,不允许其耗费过长时间阻塞线程。

(3) 每个依赖服务维护一个独立的线程池,一旦线程池满了,直接拒绝服务的调用。

(4) 统计依赖服务调用的成功次数、失败次数、拒绝次数、超时次数等结果。

(5) 在一段时间内,如果服务调用的异常次数超过一定阈值,就会触发熔断停止对特定服务的所有请求,在一定时间内对服务调用直接降级,一段时间后再次进行自动尝试恢复。

(6) 如果某个服务出现调用失败、被拒绝、超时等异常情况,自动调用fallback降级机制。

(7) 实时监控指标和配置变化。

关于Hystrix工作机制的深入分析将在后面小节详解,这里大家对Hystrix熔断机制有个大致了解即可。


猜你喜欢:

Spring Cloud和Dubbo的区别是什么?

什么是Spring Cloud?Spring Cloud介绍

微服务架构有哪些功能?

黑马程序员Java高级软件工程师课程

分享到:
在线咨询 我要报名
和我们在线交谈!