熔斷機制至關於電路的跳閘功能,即在必定時間內,錯誤比例達到必定數目時業務從原來流程轉移到另外的流程處理。在一段時間後,恢復到原業務邏輯。java
測試代碼以下緩存
/** * @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;