Hystrix使用

1. Hystrix是誰?

Hystrix源於Netflix API團隊在2011年啓動的彈性工程工做,而目前它在Netflix天天處理着數百億的隔離線程以及數千億的隔離信號調用。該庫旨在經過控制那些訪問遠程系統、服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。Hystrix具有擁有回退機制和斷路器功能的線程和信號隔離,請求緩存和請求打包,以及監控和配置等功能。
目前託管在github上。git

2. 爲何須要Hystrix?

在大中型分佈式系統中,一般系統不少依賴(HTTP,Dubbo等),若是一個應用不能對來自依賴的故障進行有效處理,那該應用自己就處在被拖垮的風險中。在一個高流量的網站中,某個單一的後端一旦發生延遲,將會在數秒內致使全部應用資源被耗盡。github

例如:一個依賴30個服務的系統,每一個服務99.99%可用。
此係統的失敗率爲1-99.99%的30次方 ≈ 0.3%
意味着一億次請求 會有 3,000,00次失敗
隨着服務依賴數量的變多,服務不穩定的機率會成指數性提升.後端

Hystrix把服務調用統稱爲依賴調用, Hystrix經過命令模式封裝依賴調用,每個依賴調用封裝在HystrixCommand中,每一個命令在Hystrix的線程池中運行。另外能夠對其配置分組名、線程組,使得不一樣的依賴能夠分類在不一樣的線程組,隔離不一樣模塊的依賴,也可根據負載狀況,配置不一樣組的線程數。Hystrix還提供一種熔斷器(CircuitBreaker)的機制,Hystrix能夠經過設定的條件判斷該封裝的依賴調用是否能夠正確調用,若是在必定時間內調用失敗次數過多,則會熔斷自身,使得相同的調用沒法執行,待冷卻以後從新再試。緩存

3. 如何使用?

1.pom.xml中加入依賴app

<dependency>  
     <groupId>com.netflix.hystrix</groupId>  
     <artifactId>hystrix-core</artifactId>  
     <version>${hystrix.version}</version>  
 </dependency>

2.繼承HystrixCommand,在run()方法中完成對依賴的調用:異步

public class CustomeCommand extends HystrixCommand<String> {  
  
    protected CustomeCommand(String input) {  
    //設置HystrixCommand的屬性
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomeGroup"))  
                .andCommandKey(HystrixCommandKey.Factory.asKey("CustomeKey"))  
                .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("CustomeThreadPool"))  
                .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()  
                        .withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD))  
                .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()  
                        .withCoreSize(10))  
        );  
   
    }  
  
    @Override  
    protected String run() throws Exception {
    //訪問真正的服務  
        return "hello World!";  
    }    
    //服務降級
    @Override  
    protected String getFallback() {  
        return "exeucute Falled";  
    }  
    //請求緩存  
    @Override  
    protected String getCacheKey() {  
        //  
    }  
}

HystxixCommand支持以下的配置:

GroupKey:該命令屬於哪個組,能夠幫助咱們更好的組織命令。
CommandKey:該命令的名稱
ThreadPoolKey:該命令所屬線程池的名稱,一樣配置的命令會共享同一線程池,若不配置,會默認使用GroupKey做爲線程池名稱。
CommandProperties:該命令的一些設置,包括斷路器的配置,隔離策略,降級設置,以及一些監控指標等。
ThreadPoolProerties:關於線程池的配置,包括線程池大小,排隊隊列的大小等。分佈式

3.調用HystrixCommandide

CustomeCommand command = new CustomeCommand();  
        String result = command.execute();

HystrixCommand提供了3種執行方式:

同步執行:即一旦開始執行該命令,當前線程就得阻塞着直到該命令返回結果,而後才能繼續執行下面的邏輯。當調用命令的execute()方法即爲同步執行(內部使用queue().get() )。
異步執行:命令開始執行會返回一個Future<T>的對象,不阻塞後面的邏輯,開發者本身根據須要去獲取結果。當調用HystrixCommand的queue()方法即爲異步執行。gradle

CustomeCommand command = new CustomeCommand();  
        Future<String> result = command.queue();  
        while (!result.isDone()){  
            System.out.println("Do other things ..."); 
            }

響應式執行:命令開始執行會返回一個Observable<T> 對象,開發者能夠給給Obeservable對象註冊上Observer或者Action1對象,響應式地處理命令執行過程當中的不一樣階段。當調用HystrixCommand的observe()方法,或使用Observable的工廠方法(just(),from())即爲響應式執行,這個功能的實現是基於Netflix的另外一個開源項目RxJava網站

CustomeCommand command = new CustomeCommand();  
        Observable<String> result = command.observe();
        result.subscribe(new Action1<String>() {
            @Override
            public void call(String str) {
                logger.info("Command called. Result is:{}", str);
            }
        });

CustomeCommand command = new CustomeCommand();
        Observable<String> result = command.observe();
        result.subscribe(new Observer<String>() {
            @Override
            public void onCompleted() {
                logger.info("Command Completed");
            }

            @Override
            public void onError(Throwable e) {
                logger.error("Command failed", e);
            }

            @Override
            public void onNext(String args) {
                logger.info("Command finish,result is {}", args);
            }
        });
    }

4. Hystrix監控

Hystrix還提供給咱們一個監控功能Hystrix-dashboard,能夠直接使用其開源項目進行配置,就能實時的觀察咱們的服務調用狀況。

1.構建dashboard項目
Shell代碼 收藏代碼
$ git clone https://github.com/Netflix/Hy...
$ cd Hystrix/hystrix-dashboard
$ ../gradlew jettyRun

打開路徑:http://localhost:7979/hystrix...

2.配置服務狀態上報

<servlet>    
  <display-name>HystrixMetricsStreamServlet</display-name>    
  <servlet-name>HystrixMetricsStreamServlet</servlet-name>    
  <servlet-class>com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet</servlet-class>  
</servlet>  
  <servlet-mapping>    
  <servlet-name>HystrixMetricsStreamServlet</servlet-name>    
  <url-pattern>/hystrix.stream</url-pattern>  
</servlet-mapping>

3.添加stream
在hystrix-dashboard中按照說明添加本身的 http://hystrix-app:port/hystr... ,而後監視
4.若是是集羣,經過turbine進行監視

5. 參考資料

https://github.com/Netflix/Hy...
http://ningandjiao.iteye.com/...
http://fobject.iteye.com/blog...

相關文章
相關標籤/搜索