熔断机制相当于电路的跳闸功能,即在一定时间内,错误比例达到一定数目时业务从原来流程转移到另外的流程处理。在一段时间后,恢复到原业务逻辑。

  测试代码如下

  

/**
* @author zimu
* @description Hystrix 熔断机制
* @since 2018-3-1 16:20
*/
public class HystrixCommand4CircuitBreakerTest extends HystrixCommand < String > { private static final Logger log = LoggerFactory.getLogger(HystrixCommand4CircuitBreakerTest.class); private final String value; public HystrixCommand4CircuitBreakerTest(String value) {
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CircuitBreakerTestGroup"))
.andCommandKey(HystrixCommandKey.Factory.asKey("CircuitBreakerTestKey"))
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("CircuitBreakerTest"))
.andThreadPoolPropertiesDefaults( // 配置线程池
HystrixThreadPoolProperties.Setter()
.withCoreSize(200) // 配置线程池里的线程数,设置足够多线程,以防未熔断却打满threadpool
)
.andCommandPropertiesDefaults( // 配置熔断器
HystrixCommandProperties.Setter()
.withCircuitBreakerEnabled(true)
.withCircuitBreakerRequestVolumeThreshold(2) //单位时间内最少请求次数
.withCircuitBreakerErrorThresholdPercentage(60) //熔断比例
.withExecutionTimeoutInMilliseconds(500) //单次执行超时时间
.withCircuitBreakerSleepWindowInMilliseconds(3000) //熔断时间窗口,默认:5秒.熔断器中断请求5秒后会进入半打开状态,放下一个请求进来重试,如果该请求成功就关闭熔断器,否则继续等待一个熔断时间窗口
)
);
this.value = value;
} @Override
protected String run() throws Exception {
log.info("run():" + value);
int num = Integer.valueOf(value);
if (num % 2 == 0 && (num < 10 || num > 20)) { // 直接返回
return value;
} else {
TimeUnit.MILLISECONDS.sleep(800);
return value;
}
} @Override
protected String getFallback() {
log.info("fallback: " + value);
return "fallback: " + value;
} public static class Test { public static void main(String[] args) {
for (int i = 0; i < 30; i++) {
try {
new HystrixCommand4CircuitBreakerTest(String.valueOf(i)).execute(); if (i > 15) {
TimeUnit.MILLISECONDS.sleep(1000);
} } catch (Exception e) {
System.out.println("HystrixBadRequestException" + e.getCause());
}
} } } }

  

附:配置参数

//熔断器在整个统计时间内是否开启的阀值,默认20秒。也就是10秒钟内至少请求20次,熔断器才发挥起作用
private final HystrixProperty<Integer> circuitBreakerRequestVolumeThreshold;
//熔断器默认工作时间,默认:5秒.熔断器中断请求5秒后会进入半打开状态,放部分流量过去重试
private final HystrixProperty<Integer> circuitBreakerSleepWindowInMilliseconds;
//是否启用熔断器,默认true. 启动
private final HystrixProperty<Boolean> circuitBreakerEnabled;
//默认:50%。当出错率超过50%后熔断器启动.
private final HystrixProperty<Integer> circuitBreakerErrorThresholdPercentage;
//是否强制开启熔断器阻断所有请求,默认:false,不开启
private final HystrixProperty<Boolean> circuitBreakerForceOpen;
//是否允许熔断器忽略错误,默认false, 不开启
private final HystrixProperty<Boolean> circuitBreakerForceClosed;

  

//配置线程池大小,默认值10个. 建议值:请求高峰时99.5%的平均响应时间 + 向上预留一些即可
 private final HystrixProperty corePoolSize; /*
 //配置线程值等待队列长度,默认值:-1 建议值:-1表示不等待直接拒绝,测试表明线程池使用直接决绝策略+ 合适大小的非回缩线程池效率最高.所以不建议修改此值。 当使用非回缩线程池时,queueSizeRejectionThreshold,keepAliveTimeMinutes 参数无效
 private final HystrixProperty maxQueueSize;  //请求合并是允许的最大请求数,默认:Integer.MAX_VALUE
 private final HystrixProperty maxRequestsInBatch;
 //批处理过程中每个命令延迟的时间,默认:10毫秒
 private final HystrixProperty timerDelayInMilliseconds;
 //批处理过程中是否开启请求缓存,默认:开启
 private final HystrixProperty requestCacheEnabled;

  

05-11 15:11