Spring Cloud Circuit Breaker

Spring Cloud熔断器能有效防止因网络访问延迟和故障造成的应用级联故障,本文将从问题的根源解读Spring Cloud断路器。

问题

跨进程或跨主机的远程调用都会面临失败的可能,单纯的调用失败对系统而言影响不大,但调用失败的副作用往往会拖垮应用,长时间的等待被占用的系统资源无法释放、用户反复的刷新加速资源消耗,如果被阻塞的接口是流程的前置条件。系统在恶性循环中吞吐量被迅速拉低,最坏的情况将导致应用资源耗尽停止服务(雪崩效应)。

解决方案

熔断

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

隔离

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

限流

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

断路器/熔断(Curcuit Breaker)模式

断路器在应用失败次数达到阀值后,直接给调用方返回备用方案,是系统交互中超时问题和容错的解决方案,对系统能力起到保护作用。

断路器背后的基本思想非常简单,将受保护的调用包装在断路器对象中,该对象监控故障发生情况。一旦故障达到某个阈值,断路器就会跳闸,此时,所有对断路器的调用都会返回错误,而不会对受保护的应用进行调用。通常,如果断路器跳闸,还需要某种监控警报。

Spring Cloud Circuit Breaker

Spring Cloud Circuit breaker是对断路器方案的抽象,支持不同的断路器实现,为应用程序提供统一的API,根据应用需要选择不同的断路器实现。Spring Cloud目前支持四种断路器实现:Netfix HystrixResilience4JSentinelSpring Retry,如果,有兴趣可以查看它们对比结果

创建Spring Cloud Circuit breaker

Spring Initializr页面,输入breaker,选择Hystrix组件,点击[Generate the project],就拥有了一个基础的Spring Cloud Circuit breaker项目。Spring Cloud熔断器集成了对Feign的支持,Feign意在简化Web调用的复杂性,Spring Cloud Feign组件包装了负载均衡(Ribbon)和熔断功能,大大简化了调用。具体代码参考Spring Cloud熔断器指南

Hystrix断路器工作原理

Hystrix是断路器模式的实现,对通过网络访问的依赖项进行延迟和故障的控制。主要思想是在具有大量微服务的分布式环境中停止级联故障。有助于快速失败并尽快恢复——这是自修复容错系统的重要方面。

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

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

在切面中使用CommandExecutor.execute对目标进行调用,调用支持三种类型:同步、异步、观察者/响应式,这里的响应式调用使用了RxJava框架(基于JVM的ReactiveX实现)。

GenericCommand.getFallBack方法负责熔断后的处理(服务降级)。HystrixThreadPoolDefault负责Hystrix断路器的线程,当线程池、请求队列或信号量被占满的也会引发服务降级。