天天看点

hystrix原理_Spring Cloud-熔断器Hystrix学习笔记

hystrix原理_Spring Cloud-熔断器Hystrix学习笔记

一.简介

1.什么是Hystrix

在分布式环境中,许多服务依赖中的一些必然会失败。Hystrix是一个通过添加延迟容忍和容错逻辑来帮助您控制这些分布式服务之间的交互的库。Hystrix通过隔离服务之间的访问点、停止跨服务的级联故障并提供回退选项来实现这一点,所有这些都可以提高系统的整体弹性。

2.Hystrix解决什么问题(github)

复杂分布式体系结构中的应用程序具有数十种依赖关系,每种依赖关系不可避免地会在某个时刻失败。如果主机应用程序未与这些外部故障隔离开来,则可能会被淘汰。

例如,对于依赖于30个服务的应用程序,其中每个服务的正常运行时间为99.99%,您可以期望:

99.99 30 = 99.7%的正常运行时间

10亿个请求中的0.3%= 3,000,000次故障

/每月2小时以上的停机时间,即使所有依赖项都具有出色的正常运行时间。

现实通常更糟。

即使您没有对整个系统进行永续性设计,即使所有依赖项都能很好地执行,即使0.01%的停机时间对数十种服务中的每一项的总影响也等于一个月可能停机数小时。在微服务系统中,一个用户请求可能需要调用几个服务才能完成,如图1,在所有的服务都处于可用状态时,一个用户请求需要调用A、H、I和P。

hystrix原理_Spring Cloud-熔断器Hystrix学习笔记

图1 正常情况下一个请求的状态(网络图)

当一个服务,例如服务I,出现网络延迟或者故障,即使服务A、H、P可用,整个系统也会出现阻塞现象并等待服务I的响应。如图2。

hystrix原理_Spring Cloud-熔断器Hystrix学习笔记

图2 当某个服务出现故障(网络图)

在高并发的情况下,单个服务的延迟会导致整个请求都处于延迟状态,可能在几秒就使整个服务处于线程饱和状态。某个服务的单个点的请求故障会导致用户的请求处于阻塞状态,最终的结果就是整个服务的线程资源消耗殆尽。由于服务的依赖性,会导致依赖于该故障服务的其他服务也处于线程阻塞状态,最终导致这些服务的现成资源消耗殆尽,直到不可用,从而导致整个微服务系统的不可用,即雪崩效应。

源码地址:https://github.com/Netflix/Hystrix

3.Hystrix的设计原理

  1. 防止单个服务的故障耗尽整个服务的Servlet容器的线程资源
  2. 快速失败机制,如果某个服务出现了故障,则调用该服务的请求快速失败,而不是线程等等
  3. 提供回退(fallback)方案,在请求发生故障时,提供设定好的回退方案
  4. 使用熔断机制,防止故障扩散到其它服务
  5. 提供熔断器的监控组件Hystrix Dashboard,可以实时监控熔断器的状态

4.Hystrix的工作机制

hystrix原理_Spring Cloud-熔断器Hystrix学习笔记

图3 熔断器机制

当服务的某个API接口的失败次数在一定时间内小于设定的阈值时,熔断器出于关闭状态,该API接口正常提供服务。当该API接口处理请求的失败次数大于设定的阈值时,Hystrix判定该API端口出现了故障,打开熔断器,这时请求该API接口会执行快速失败的逻辑(即fallback回退的逻辑),不执行业务逻辑,请求的线程不会出于阻塞状态。处于打开状态的熔断器,一段时间后会出于半打开状态,并将一定数量的请求执行正常逻辑。剩余的请求会执行快速失败,若执行正常逻辑的请求失败了,则熔断器继续打开;若成功了,则熔断器关闭。这样熔断器就具备了自我修复的能力。

二.Hystrix使用实例

1.RestTemplate和Ribbon使用实例

基于eureka-service、eureka-client、ribbon三个模块进行测试。首先引入pom,Hystrix配置。

<
           

设置启动类:

@EnableHystrix
           

配置RibbonService:

@Service
           

启动三个项目,当正常访问http://localhost:8070/hello/ribbon 打印:Hello World!。关闭eureka-client时,打印:error!。可见当关闭eureka-client时,访问http://localhost:8070/hello/ribbon,eureka-client没有反应,开启了熔断器,最后进入fallbackMethod的逻辑。进入快速失败,请求得到及时处理,线程不在阻塞。

2.Feign使用实例

在feign-client项目的application.yml配置文件添加启动Hystrix的功能配置:

feign: 
  
           

添加TestHystrix:

@Component
           

修改FeignClientService:

@FeignClient
           

访问http://localhost:8060/hello/feign 打印:Hello World!test。当关掉eureka-client时,打印:hello,test,sorry error!。即:当eureka-client不可用时,feign-client进入了fallback的逻辑,由这个类来执行熔断器打开是的处理逻辑。

三.Hystrix Dashboard的使用

1.在RestTemplate中使用Hystrix Dashboard

引入依赖:

<
           

开启Hystrix Dashboard功能:

@EnableHystrixDashboard
           

访问:http://localhost:8070/hystrix.stream 浏览器上面会打印熔断器的数据指标。

hystrix原理_Spring Cloud-熔断器Hystrix学习笔记

图4 熔断器数据指标

访问:http://localhost:8070/hystrix 进入Dashboard首页。

hystrix原理_Spring Cloud-熔断器Hystrix学习笔记

图5 Hystrix Dashboard主页

在上面分别输入http://localhost:8070/hystrix.stream,2000,test会出现如下数据分析图。

hystrix原理_Spring Cloud-熔断器Hystrix学习笔记

图6 Hystrix Dashboard展示图

2.feign中使用Hystrix Dashboard

同上!!!

四.Turbine聚合监控

Turbine用于集合多个Hystrix Dashboard,将多个Hystrix Dashboard放在一个页面展示,进行集中监控。

添加依赖pom.xml

<
           

配置application.yml文件:

spring: