Hystrix進行熔斷降級

引入須要的包

<!--核心包-->
<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。

更多請參考:https://www.sohu.com/a/134459931_494947spa

相關文章
相關標籤/搜索