整合spring-cloud斷路器之Hystrix
前言
昨天我們分享了spring-cloud
基於feign
宣告式的服務呼叫,演示了宣告式服務呼叫的基本過程,雖然還有很多內容沒有分享,但是現階段僅考慮基本用法,所以更詳細的內容暫時先不展開,等這一輪內容分享結束之後,我們再視情況分享。
今天我們要開始分享另一個spring-cloud
核心元件——Hsystrix
。Hystrix
中文含義豪豬,但是它實際的作用和它的名稱卻相去甚遠,在我們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
的實現原理。
好了,今天就到這裡吧,大家晚安!