官方解释熔断器
- 在SpringCloud体系中,熔断器是Hystrix,其英文意思是豪猪,如果我们把整个程序看做🐖,那么刺就是保护机制
- Hystrix是Netflix公司的一款组件
- 官方解释是NetFlix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库、防止出现级联失败(即雪崩效应)
雪崩效应
俗话说得好,“雪崩时没有一片雪花是无辜的”
- 那么在微服务中,一个接口就对应一片雪花,当我们发送一个请求时,可能需要多个微服务的接口才能实现,这就形成了一个复杂的调用链路
- 如果在这个复杂的级联调用链路中,某个服务出现异常,请求阻塞,用户得不到响应,容器中线程就不会释放,于是导致了越来越多的请求被堆积,越来越多的线程堵塞
- 单个服务器能够支持的线程和并发数量有限,请求如果一直阻塞,将会导致服务资源耗尽,从而导致所有其他服务都不可用,这就形成了雪崩效应
熔断器的核心
线程隔离和服务降级
线程隔离
- 线程隔离又叫做资源隔离,是SpringCloud自己去做的,无需我们做什么,但是我们需要知道原理
- Hystrix 主要通过线程池来实现资源隔离,通常在使用的时候会根据调用的远程服务划分出多个线程池,类比糖果分盒子装
- 这样做的主要优点是运行环境被隔离开了,这样就算调用服务的代码存在bug或因其他原因导致自己所在的线程池被耗尽,也不会对系统的其他服务造成影响
- 但这样做带来的代价就是维护多个线程池会对系统带来额外的性能开销
服务降级
- 服务降级又叫做兜底,落实到操作上就是我们看到的FallBack
- 我们通过实现一个FallBack方法,当请求后端服务出现异常的时候,就调用FallBack方法返回的值
实现线程隔离和服务降级之后,当用户的请求出现故障时,线程不会被阻塞,更不会做无休止的等待直到系统崩溃,至少可以使用户看到执行结果
熔断器机制
熔断器有三种状态:关闭、打开、半开
- 在关闭状态下,所有的请求都可以正常访问
- 在打开状态下,所有的请求都会被降级
Hystrix 会对请求情况进行技术,当一定时间内失败请求百分比达到阈值(也就是我们配置文件中的errorThresholdPercentage),就会触发熔断器,所有的请求不会被发送到后端而是直接失败
默认的失败比例阈值为50%,请求次数不低于20次 - 半开状态
打开状态并不是永久的,熔断器打开一会后会进入休眠状态(默认5秒)。休眠时间过后会进入半开状态
半开状态下,熔断器会判断下一次请求的返回状况,如果成功,熔断器切换到关闭状态,服务正常,如果依旧失败,说明服务未恢复,熔断器会切到打开状态继续熔断
所以熔断器的机制很像家庭电路中的保险丝,一旦后端服务不可用,保险丝断裂,切断请求链,直接迅速的避免了大量无效请求影响系统吞吐量,且熔断器有自我检测并恢复的能力
那么什么时候熔断器会进行熔断呢
1、请求访问超时
2、服务不可用(已死)
3、服务抛出异常(虽然有异常但还活着)
4、其他请求导致服务异常达到阈值,所有服务都会被降级