Spring Cloud Circuit Breaker - 熔断器

Spring Cloud熔断器能有效防止网络延迟和故障造成的应用级联故障。

熔断

服务响应慢或大量超时熔断该服务,后续调用直接返回,直到目标服务出现好转。

隔离

不同业务使用不同线程池,不同业务间的请求互不影响,某一类业务耗尽线程池资源,后续请求直接返回。

限流

对应用QPS有一个合理的预期,高于预期阀值时,后续请求会直接返回。

断路器/熔断模式

断路器在应用失败次数达到阀值后,直接返回备用方案,对系统能力起到保护作用。

断路器背后的基本思想非常简单:

将受保护的调用包装在断路器对象中,该对象监控故障发生情况。

一旦故障达到某个阈值,断路器就会跳闸,此时,所有对断路器的调用都会返回错误,不会对受保护的应用执行调用。

通常,若断路器跳闸,还需某种监控警报。

Spring Cloud Circuit Breaker

Spring Cloud Circuit breaker是断路器的抽象,支持不同的断路器实现,为应用程序提供统一API。

根据应用需要选择不同的断路器实现。

Spring Cloud目前支持四种断路器实现:Netfix HystrixResilience4JSentinelSpring Retry,有兴趣可以查看对比结果

新建

Spring Initializr输入breaker,选择Hystrix组件,点击[Generate the project]。

Spring Cloud熔断器集成对Feign支持,Feign意在简化Web调用复杂性,Spring Cloud Feign组件包装了负载均衡(Ribbon)和熔断功能,大大简化了调用。

具体参考Spring Cloud熔断器指南

工作原理

Hystrix是断路器模式实现,对使用网络访问的依赖进行延迟和故障保护。

在具有大量微服务的分布式环境中熔断级联故障。

有助于快速失败并尽快恢复——这是自修复容错系统重要方面。

Hystrix使用Aspect对目标进行包装,具体调用查看:

com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect.methodsAnnotatedWithHystrixCommand

在切面中使用CommandExecutor.execute对目标执行调用,调用支持三种类型:

同步、异步、观察者/响应式。

这里的响应式调用使用RxJava框架(基于JVM的ReactiveX实现)。

GenericCommand.getFallBack方法负责熔断后的处理(服务降级)。

HystrixThreadPoolDefault负责Hystrix断路器的线程,当线程池、请求队列、信号量被占满时会触发服务降级。