断路器
作用
断路器的作用在于当一个请求无法进行或者需要暂时屏蔽时,我们可以在请求执行前将这个请求打断,从而达到暂时屏蔽请求的目的。在我们的工作过程中,这样的场景通常表现为一个请求的提供端由于某种原因无法提供标准的服务时,我们需要及时屏蔽这个资源的请求,从而保证我们的服务整体可用,同时也为服务提供端营造一个良好的过渡阶段不至于在高压请求下发生服务崩溃而造成大面积雪崩的窘迫局面。
原理
断路器在Hystrix的使用中原理非常简单,它的顶级接口只定义了5个方法用于描述他的功能。命令在执行请求前会询问断路器尝试执行,是否允许请求,如果不允许请求,则会进入快速失败流程;如果允许执行则会执行业务并统计执行结果,反馈给健康监控,健康监控又会反过来作用与断路器从而支持基于指标的断路器功能。
断路器的五个方法分别是:
/**
* 是否允许请求
* 这个方法目前只在测试单元适用,并未在核心代码中适用
* @return
*/
boolean allowRequest();
/**
* 断路器是否开启
* @return
*/
boolean isOpen();
/**
* 标记成功,在 {@link HystrixCommand} 成功执行时调用,作为处于半开状态时的反馈机制的一部分。
*/
void markSuccess();
/**
* 标记未成功,在 {@link HystrixCommand} 未成功执行时调用,作为处于半开状态时的反馈机制的一部分。
*/
void markNonSuccess();
/**
* 这是断路器的主要方法,一个请求是否允许执行通过这个方法返回。
* 在命令执行开始时调用以尝试执行。这是非幂等的 - 它可能会修改内部状态。
* @return
*/
boolean attemptExecution();
我们在使用断路器时,只需要实现这五个方法,便可以对命令的执行进行灵活的断路。这五个方法中真正对请求进行断路的是attemptExecution()。搭配其余方法与指标监控,可以轻松实现一个基于指标监控的断路器。此外,Hystrix属性体系也为我们提供了几个关于断路器的属性设置,分别是:
/**
* 默认的断路器请求阈值 20个/10s
*/
private static final Integer default_circuitBreakerRequestVolumeThreshold = 20;
/**
* 默认的断路器休眠窗口:5s
* 当请求发生熔断后,下次尝试间隔5s。
*/
private static final Integer default_circuitBreakerSleepWindowInMilliseconds = 5000;
/**
* 默认的断路器触发预警,失败率阈值:50%/10s
*/
private static final Integer default_circuitBreakerErrorThresholdPercentage = 50;
/**
* 默认的断路器强制打开开关:关闭
*/
private static final Boolean default_circuitBreakerForceOpen = false;
/**
* 默认的断路器强制关闭开关:关闭
* 忽略异常:false
*/
/* package */ static final Boolean default_circuitBreakerForceClosed = false;
我们可以在构建命令时自定义命令属性来设置这些属性。