SPRINGCLOUD五大组件及相关注解整理

二、服务的熔断降级—Netflix Hystrix

a.Hystrix是什么

在微服务的架构系统中,每个服务都可能会调用很多其他服务,被调用的那些服务就是依赖服务。有的时候某些依赖服务出现故障也是很正常的。Hystrix可以让我们在对服务间的调用进行控制,加入一些调用延迟或者依赖故障的容错机制。Hystrix通过将依赖服务进行资源隔离,进而组织某个依赖服务出现故障的时候,这种故障在整个系统所有的依赖服务调用中进行蔓延,同时Hystrix还提供故障时的fallback降级机制。总而言之,Hystrix通过这些方法帮助我们提升系统的可用性和稳定性。说白了就是“保护”我们服务之间的调用!

b.简单介绍Hystrix的使用

1.springboot启动类上加上注解@EnableHystrix(@EnableCircuitBreaker,点击进入可以看到@EnableHystrix是包含@EnableCircuitBreaker注解的,这种问题后面将不做阐述)
SPRINGCLOUD五大组件及相关注解整理

2.在需要用到的方法上添加注解@HystrixCommand
SPRINGCLOUD五大组件及相关注解整理
具体的属性,可以点击注解查看,
SPRINGCLOUD五大组件及相关注解整理
具体的使用方法可以自行度娘或者官方文档!

例如简单介绍两种:服务熔断降级回掉方法、为某个单独的方法创建独立的线程池执行任务:

SPRINGCLOUD五大组件及相关注解整理
一些常用的属性名称可以在HystrixThreadPoolProperties、HystrixCommandProperties等对应的配置文件中查找!
一般这种单独使用的基本项目不会用到,所以这里就不做特别细的阐述!

c.Hystrix的工作原理

1.首先我们思考个问题:为什么Hystrix能够帮我们实现服务的熔断降级功能?

其实这跟它的注解@HystrixCommand是有关系的,Hystrix将添加了注解@HystrixCommand的方法进行了“包裹”,交给其内部线程池来执行这些方法!因此它自然能够控制我们的方法了!如下图:

SPRINGCLOUD五大组件及相关注解整理
这种模式在某种情况下也会出现问题:左连续请求10次或以上,此时线程池中的线程已全部被使用,导致右边的请求无法请求到服务。

出现这种情况我们怎么解决呢?首先增加线程数量肯定是不可行的。。因为并发大时总会被沾满。

Hystrix为我们提供了自定义线程池的方法,即我们可以为每个方法自定义他们自己的线程池,完成任务的隔离!如下图所示:

SPRINGCLOUD五大组件及相关注解整理

2.Hystrix原理(工作流程)

流程图如下:

SPRINGCLOUD五大组件及相关注解整理
1)当调用服务出错时,开启一个时间窗(默认10s);

2)在时间窗内统计调用次数是否达到最小请求次数?
如果没有达到最小请求次数,则重置统计信息,回到第一步;
如果达到了,统计失败请求数占总请求数的百分比,是否达到阈值?
如果没有达到,则重置统计信息,回到第一步;
如果达到,则开启跳闸(不再请求对应的服务);

3)如果跳闸,则会 开启一个活动窗口(默认5s),每隔5s Hystrix会放一个请求通过(前提是有请求过来,他不会自己发送请求),请求那个病危的服务,看是否能够调用成功?
如果成功,则重置断路器,回到步骤一;
如果失败,则重新回到步骤三;

针对以上工作原理,我们可以修改Hystrix的一些默认属性值,这里就不做演示!
(时间窗长度、最小请求数、阈值、活动窗口长度)

其他的一些高级属性配置即使用,大佬们可以根据项目情况自行探索使用!