Hystrix 使用入門

在不少系統架構中都須要考慮橫向擴、單點故障等問題,對於一個龐大的應用集羣,部分服務或者機器出現問題不可避免,在出現故障時,如何減小故障的影響、保障集羣的高可用,成爲一個重要的工做,Hystrix 是一個幫助解決分佈式系統交互時超時處理和容錯的類庫,它一樣擁有保護系統的能力。Hystrix 主要實現如下功能: apache

  • 當所依賴的網絡服務發生延遲或者失敗,對訪問的客戶端程序進行保護,在短期內訪問失敗會致使執行回退邏輯。
  • 在分佈式系統中,中止級聯故障。
  • 網絡服務恢復正常後,能夠快速恢復客戶端的訪問能力。
  • 調用失敗時,執行服務回退

   

Hystrix 使用示例 網絡

  • 建立項目

    建立Maven項目,命名爲 hystrix-client,並增長 hystrix 依賴和 Http 提交相關依賴,POM.xml 內容以下:架構

    <?xmlversion="1.0"encoding="UTF-8"?>maven

    <projectxmlns="http://maven.apache.org/POM/4.0.0" 分佈式

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ide

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"> 測試

    <modelVersion>4.0.0</modelVersion> this

       

    <groupId>org.lixue</groupId>url

    <artifactId>hystrix-client</artifactId> spa

    <version>1.0-SNAPSHOT</version>

       

    <dependencies>

    <!--Hystrix依賴-->

    <dependency>

    <groupId>com.netflix.hystrix</groupId>

    <artifactId>hystrix-core</artifactId>

    <version>1.5.12</version>

    </dependency>

    <!--logback日誌依賴-->

    <dependency>

    <groupId>ch.qos.logback</groupId>

    <artifactId>logback-classic</artifactId>

    <version>1.2.3</version>

    </dependency>

    <!--http客戶端依賴-->

    <dependency>

    <groupId>org.apache.httpcomponents</groupId>

    <artifactId>httpclient</artifactId>

    <version>4.5.3</version>

    </dependency>

    </dependencies>

    </project>

       

  • 建立 Hystrix 命令類

    命令類須要繼承 HystrixCommand 類,並實現其 run 方法執行具體業務,實現 getFallback 方法執行回退業務,在調用 run 方法超時或者斷路器處於打開狀態時,會調用 getFallback 方法進行回退。

    package org.lixue.hystrixclient;

       

    import com.netflix.hystrix.HystrixCommand;

    import com.netflix.hystrix.HystrixCommandGroupKey;

    import com.netflix.hystrix.HystrixCommandProperties;

    import org.apache.http.HttpResponse;

    import org.apache.http.client.methods.HttpGet;

    import org.apache.http.impl.client.CloseableHttpClient;

    import org.apache.http.impl.client.HttpClients;

    import org.apache.http.util.EntityUtils;

       

    public class SpeakSleepCommand extends HystrixCommand<String>{

    private int sleep;

    private CloseableHttpClient httpClient;

    private String url;

       

    public SpeakSleepCommand(intsleep){

    super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("Speak"))

    .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()));

    this.sleep=sleep;

    this.httpClient=HttpClients.createDefault();

    this.url="http://localhost:8080/speak/sleep?seconds="+this.sleep;

    }

       

    protected String run() throws Exception{

    try{

    HttpGet request=new HttpGet(this.url);

    HttpResponse response=httpClient.execute(request);

    return EntityUtils.toString(response.getEntity());

    }catch(Exceptionex){

    ex.printStackTrace();

    return ex.getMessage();

    }

    }

       

    @Override

    protected String getFallback(){

    return"call fallback";

    }

    }

       

  • 建立啓動類

    實例化咱們建立的 SpeakSleepCommand 類,並調用 execute 來執行(調用 run 方法不會使用 Hystrix)

    package org.lixue.hystrixclient;

       

    public class HystrixClient{

    public static void main(String[]args){

    SpeakSleepCommand cmd=new SpeakSleepCommand(10);

    try{

    Stringresult=cmd.execute();

    System.out.println("請求結果="+result);

    }catch(Exceptionex){

    ex.printStackTrace();

    }

    }

    }

       

  • 測試驗證

    默認狀況下,Hystrix 是 1000 毫秒超時,咱們在實例化傳入的是10秒,所以在調用的時候會執行 getFallback 方法;若是修改在實例化傳入 0 秒,不進行阻塞,會正常返回結果值。

相關文章
相關標籤/搜索