(24)SpringCloud-Hystrix(熔斷器)介紹及使用

JIAN2發表於2022-11-03

Hystrix 是 Netflix 針對微服務分散式系統採用的熔斷保護中介軟體,相當於電路中的保險絲。

在分散式環境中,許多服務依賴項中的一些必然會失敗。Hystrix 是一個庫,透過新增延遲容忍和容錯邏輯,幫助你控制這些分散式服務之間的互動。Hystrix 透過隔離服務之間的訪問點、停止級聯失敗和提供回退選項來實現這一點,所有這些都可以提高系統的整體彈性。

在微服務架構下,很多服務都相互依賴,如果不能對依賴的服務進行隔離,那麼服務本身也有可能發生故障,Hystrix 透過 HystrixCommand 對呼叫進行隔離,這樣可以阻止故障的連鎖效應,能夠讓介面呼叫快速失敗並迅速恢復正常,或者回退並優雅降級。
Hystrix 的簡單使用
建立一個空的 Maven 專案,在專案中增加 Hystrix 的依賴,程式碼如下所示。

<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-core</artifactId>
    <version>1.5.18</version>
</dependency>

編寫第一個 HystrixCommand,程式碼如下所示。

public class MyHystrixCommand extends HystrixCommand<String> {
    private final String name;
    public MyHystrixCommand(String name) {
        super(HystrixCommandGroupKey.Factory.asKey("MyGroup"));
        this.name = name;
    }
    @Override
    protected String run() {
        return this.name + ":" + Thread.currentThread().getName();
    }
}


首先需要繼承 HystrixCommand,透過建構函式設定一個 Groupkey。具體的邏輯在 run 方法中,我們返回了一個當前執行緒名稱的值。寫一個 main 方法來呼叫上面編寫的 MyHystrixCommand 程式,程式碼如下所示。

public static void main(String[] args) throws InterruptedException, ExecutionException {
    String result = new MyHystrixCommand("zhangsan").execute();
    System.out.println(result);
}


輸出結果如圖 1 所示:


從圖 1 中可以看到輸出結果是“zhangsan:hystrix-MyGroup-1”。由此可以看出,建構函式中設定的組名變成了執行緒的名字。

上面是同步呼叫,如果需要非同步呼叫可以使用如下程式碼所示的方法。

public static void main(String[] args) throws InterruptedException, ExecutionException {
    Future<String> future = new MyHystrixCommand("zhangsan").queue();
    System.out.println(future.get());
}


執行結果和圖 1 相同。
回退支援
下面我們透過增加執行時間模擬呼叫超時失敗的情況。首先改造 MyHystrixCommand,增加 getFallback 方法返回回退內容,程式碼如下所示。

public class MyHystrixCommand extends HystrixCommand<String> {
    private final String name;
    public MyHystrixCommand(String name) {
        super(HystrixCommandGroupKey.Factory.asKey("MyGroup"));
        this.name = name;
    }
    @Override
    protected String run() {
        try {
            Thread.sleep(1000 * 10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return this.name + ":" + Thread.currentThread().getName();
    }
    @Override
    protected String getFallback() {
        return "失敗了 ";
    }
}

重新執行呼叫程式碼,執行結果如圖 2 所示,可以發現返回的內容是“失敗了”,證明已經觸發了回退。

(24)SpringCloud-Hystrix(熔斷器)介紹及使用




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70006413/viewspace-2921618/,如需轉載,請註明出處,否則將追究法律責任。

相關文章