1. 程式人生 > 其它 >整合spring-cloud斷路器之Hystrix

整合spring-cloud斷路器之Hystrix

前言

昨天我們分享了spring-cloud基於feign宣告式的服務呼叫,演示了宣告式服務呼叫的基本過程,雖然還有很多內容沒有分享,但是現階段僅考慮基本用法,所以更詳細的內容暫時先不展開,等這一輪內容分享結束之後,我們再視情況分享。

今天我們要開始分享另一個spring-cloud核心元件——HsystrixHystrix中文含義豪豬,但是它實際的作用和它的名稱卻相去甚遠,在我們spring-cloud家族中,它的用途就是斷路器,也叫熔斷器。

正如,電路里面的熔斷器一樣,spring-cloud中的熔斷器也起著同樣的作用,有所不同的是,電路中的熔斷器是根據電路中的電流大小出發的,而我們的Hystrix

是根據服務的超時時間觸發的,也就是說如果某一個服務達到了我們設定的超時時間,沒有正常返回的話,就會觸發我們的斷路操作,然後會將短路操作的結果返回。

下面,我們通過一個具體的例項來演示下Hystrix的斷路原理。

Hystrix

首先我們需要先建立一個spring-boot專案,然後引入hystrix的核心依賴。這個依賴就加在我們需要熔斷操作的服務的依賴中,也就是服務提供者的依賴中。

依賴

下面是hystrix的核心依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.2.9.RELEASE</version>
</dependency>

因為我們的服務都有都是基於eureka註冊中心呼叫的,所以我們也需要加入eureka的相關依賴和配置,具體可以參考這幾天的demo

配置

這裡也是針對服務提供者的配置,在專案入口類上加上@EnableCircuitBreaker註解,即可啟用Hystrix熔斷器。這樣,我們的服務就支援熔斷操作了。

@SpringBootApplication
@EnableCircuitBreaker
public class SpringCloudHystrixDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudHystrixDemoApplication.class, args);
    }

}

介面熔斷配置

這裡設定的介面的配置,只需要在接收上加上@HystrixCommand註解即可啟用斷路器。

為了方便演示,我們這裡生成一個隨機睡眠時間,人為模擬超時情形。預設情況下,Hystrix的超時熔斷時間為1000ms,即只要超過2000ms未正常響應,我們的超時熔斷機制就會被觸發,然後執行我們的熔斷回撥方法。

Hystrix的熔斷超時時間是可以設定的,而且其他相關的配置項也有很多,由於篇幅和時間的原因,今天我們就先不展開講了,後面有機會再來分享。

@RequestMapping("/tetHystrix/{name}")
@HystrixCommand
public Object hystrix(@PathVariable(name = "name") String name) {
    JSONObject jsonObject = new JSONObject();
    try {
        Double v = 3000 * Math.random();
        System.out.println("name: " + name + " 睡眠時間:" + v);
        jsonObject.put("sleep", v.longValue());
        jsonObject.put("name", name);
        jsonObject.put("message", "請求成功");
        Thread.sleep(v.longValue());
    } catch (Exception e) {
        System.out.println(e);
    }
    return jsonObject;
}

@HystrixCommand註解是支援指定熔斷器回撥方法的,也就是熔斷觸發時呼叫的方法,如果不指定回撥方法的話,預設返回的是500錯誤,下面是前端頁面的返回結果:

後端也有錯誤丟擲,我們可以看到hsystrix timed-out and fallback failed錯誤提示:

這也就是說如果啟用斷路器,必須指定回撥方法,否則雖然也觸發了熔斷機制,但對呼叫方而言並不友好,當然如果你只是需要觸發斷路器,報錯也無所謂,那不指定回撥方法也不影響。

指定熔斷回撥方法也很簡單,只需要在註解中指定fallbackMethodd的值即可,它的值就是我們回撥方法名稱

@HystrixCommand(fallbackMethod = "error")

同時我們需要定義一個名字為error,引數與介面保持一致的熔斷回撥方法:

public Object error(String name) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("message", "觸發服務熔斷機制");
        jsonObject.put("name", name);
        return jsonObject;
    }

回撥方法的名字可以根據自己的需要自定義,但是引數必須與介面保持一致,否則會報錯:

以上配置完成後,我們的服務提供者就配置好了,下面我們來看下呼叫方的一些配置。

呼叫方設定

熔斷器其實和呼叫方沒有任何關係,所以也不需要任何配置。但是為了便於我們測試,所以我們專門寫了一個測試controller,在controller內部,我們迴圈呼叫前面定義的服務提供者。

@RequestMapping("/testHy")
public Object testHystrix() {
    List<JSONObject> jsonObjectList = Lists.newArrayList();
    for (int i = 0; i < 10; i++) {
        jsonObjectList.add(restTemplate.getForObject("http://spring-cloud-Hystrix-demo/tetHystrix/" + i, JSONObject.class));
    }
    return jsonObjectList;
}

測試

測試也很簡單,我們先啟動服務提供者(加了熔斷配置的服務提供者),然後訪問我們的/testHy,我們可以看到,在所有請求中,只有4個是成功返回的,其餘的都因為超時觸發熔斷機制。

關於這一點,我們從後臺列印的睡眠時間也可以看出來:

前面我們也說了,預設情況下,超時熔斷時間為1000ms(有的書上說是3000,可能是版本問題,也有可能是作者搞錯了,我實測的結論是1000ms),如果超過這個時間,就會觸發熔斷機制,執行並返回熔斷回撥方法。

總結

關於Hystrix今天我們主要通過一個例項演示了它的用法,當然它還有很多內容,但是由於時間的關係,我們今天的內容就先到這裡,後續有時間的話,我們再好好刨析Hystrix的實現原理。

好了,今天就到這裡吧,大家晚安!