引入須要的包
<!--核心包--> <dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-core</artifactId> <version>1.5.18</version> </dependency> <!--使用切面時須要--> <dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-javanica</artifactId> <version>1.5.18</version> </dependency>
使用方式一:Java原生編碼方式
咱們能夠經過Hystrix原生編碼的方式來對訪問的接口進行控制java
步驟1:建立針對某個接口的命令對象
/** * 定義某個接口調用的指令類 * */ public class IhrTokenRequestCommand extends HystrixCommand<MResult<String>> { public IhrTokenRequestCommand(){ //配置本接口配置參數 super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ThreadPoolTestGroup")) //服務分組 .andCommandKey(HystrixCommandKey.Factory.asKey("testCommandKey")) .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("ThreadPoolTest")) .andCommandPropertiesDefaults(HystrixCommandProperties.Setter() .withExecutionTimeoutInMilliseconds(5000)) //超時時長,默認1000 .andThreadPoolPropertiesDefaults( // 配置線程池 HystrixThreadPoolProperties.Setter() .withCoreSize(50)) // 配置線程池裏的線程數 .andCommandPropertiesDefaults( // 配置熔斷器 HystrixCommandProperties.Setter() .withCircuitBreakerEnabled(true) //是否開啓熔斷機制,默認爲true。 .withCircuitBreakerRequestVolumeThreshold(20) //在熔斷開關閉合狀況下,在進行失敗率判斷以前,一個採樣週期內必須進行至少N個請求才能進行採樣統計,目的是有足夠的採樣使得失敗率計算正確,默認爲20。 .withCircuitBreakerSleepWindowInMilliseconds(3) // 熔斷後的重試時間窗口,且在該時間窗口內只容許一次重試。即在熔斷開關打開後,在該時間窗口容許有一次重試,若是重試成功,則將重置Health採樣統計並閉合熔斷開關實現快速恢復,不然熔斷開關仍是打開狀態,執行快速失敗。 .withCircuitBreakerErrorThresholdPercentage(50) //若是在一個採樣時間窗口內,失敗率超過該配置,則自動打開熔斷開關實現降級處理,即快速失敗。默認配置下采樣週期爲10s,失敗率爲50%。 ) ); } //實際執行的代碼,可主動拋出HystrixTimeoutException、HystrixRuntimeException等異常 @Override protected MResult<String> run() throws Exception { return null; } //降級方法 @Override protected MResult<String> getFallback() { MResult<String> result = new MResult<String>(ResponseCodeEnum.ERROR) ; return result; } }
步驟2:建立實例並執行
MResult<String> result = new IhrTokenRequestCommand().execute();
注意,每次調用都須要建立一個實例網絡
使用方式二:使用Spring的AOP進行控制
經過Spring的AOP,咱們能夠用更加優雅的方式來控制對接口的訪問併發
步驟1:添加所需切面的配置
在Spring的配置文件中添加如下配置ide
<aop:aspectj-autoproxy/> <bean id="hystrixAspect" class="com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect"></bean>
也能夠經過JavaConfig的方式來配置ui
@Configuration public class HystrixAspectConfiguration { @Bean public HystrixCommandAspect hystrixAspect() { return new HystrixCommandAspect(); } }
步驟2:在方法上添加註解
public class HystrixResourceApi { @HystrixCommand(commandProperties = { @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50") },fallbackMethod = "fallbackForGetUser") public String getUserById(String id) { throw new RuntimeException("getUserById command failed"); } /** * fallback 方法,原方法被降級的時候調用 * */ String fallbackForGetUser(String id) { return "unknown"; } }
接着,在須要的地方經過依賴注入的方式來正常的使用該方法便可。編碼
HystrixCommandProperties配置說明
參數 | 說明 | |
---|---|---|
withFallbackEnabled | 是否啓用降級處理,若是啓用了,則在超時或異常時調用getFallback進行降級處理,默認開啓。 | |
withFallbackIsolationSemaphoreMaxConcurrentRequests | fallback方法的信號量配置,配置getFallback方法併發請求的信號量,若是請求超過了併發信號量限制,則再也不嘗試調用getFallback方法,而是快速失敗,默認信號量爲10。 | |
withExecutionIsolationThreadInterruptOnFutureCancel | 當隔離策略爲THREAD時,當執行線程執行超時時,是否進行中斷處理,即Future#cancel(true)處理,默認爲false | |
withExecutionIsolationThreadInterruptOnTimeout | 當隔離策略爲THREAD時,當執行線程執行超時時,是否進行中斷處理,默認爲true。 | |
withExecutionTimeoutEnabled | 是否啓用執行超時機制,默認爲true | |
withExecutionTimeoutInMilliseconds | 執行超時時間,默認爲1000毫秒,若是命令是線程隔離,且配置了executionIsolationThreadInterruptOnTimeout=true,則執行線程將執行中斷處理。若是命令是信號量隔離,則進行終止操做,由於信號量隔離與主線程是在一個線程中執行,其不會中斷線程處理,因此要根據實際狀況來決定是否採用信號量隔離,尤爲涉及網絡訪問的狀況。 | |
withCircuitBreakerEnabled | 是否開啓熔斷機制,默認爲true。 | |
withCircuitBreakerForceClosed | 是否強制關閉熔斷開關,若是強制關閉了熔斷開關,則請求不會被降級,一些特殊場景能夠動態配置該開關,默認爲false。 | |
withCircuitBreakerForceOpen | 是否強制打開熔斷開關,若是強制打開可熔斷開關,則請求強制降級調用getFallback處理,能夠經過動態配置來打開該開關實現一些特殊需求,默認爲false。 | |
withCircuitBreakerErrorThresholdPercentage | 若是在一個採樣時間窗口內,失敗率超過該配置,則自動打開熔斷開關實現降級處理,即快速失敗。默認配置下采樣週期爲10s,失敗率爲50%。 | |
withCircuitBreakerRequestVolumeThreshold | 在熔斷開關閉合狀況下,在進行失敗率判斷以前,一個採樣週期內必須進行至少N個請求才能進行採樣統計,目的是有足夠的採樣使得失敗率計算正確,默認爲20。 | |
withCircuitBreakerSleepWindowInMilliseconds | 熔斷後的重試時間窗口,且在該時間窗口內只容許一次重試。即在熔斷開關打開後,在該時間窗口容許有一次重試,若是重試成功,則將重置Health採樣統計並閉合熔斷開關實現快速恢復,不然熔斷開關仍是打開狀態,執行快速失敗。熔斷後將降級調用getFallback進行處理(fallbackEnabled=true),經過Command以下方法能夠判斷是否熔斷了。 | |
isCircuitBreakerOpen | 熔斷開關是否打開了,經過「circuitBreakerForceOpen().get() | (!circuitBreakerForceClosed().get() && circuitBreaker.isOpen())」判斷。 |
isResponseShortCircuited | isCircuitBreakerOpen=true,且調用getFallback時返回true。 |