Spring Cloud與微服務之Hystrix
文章目錄
Hystrix簡介
Hystrix是由Netflix開源的一個延遲和容錯庫,用於隔離訪問遠端系統、服務或者第三方庫,防止級聯失敗,從而提升系統的可用性與容錯性。
應用場景
在微服務架構中,存在著眾多的服務單元,若一個單元出現故障,就很容易因依賴關係而引發故障的蔓延,最終導致整個系統的癱瘓,這樣的架構相較於較傳統的架構更加不穩定。為了解決這樣的問題,產生了斷路器等一系列的服務保護機制。
比如當對特定的呼叫達到一定閾值時(Hystrix中的預設值為5秒內的20次故障),電路開啟,不進行通訊,並且是在一個隔離的執行緒中進行的。
雪崩效應
在微服務架構中通常會有多個服務層呼叫的情況。而基礎服務的故障可能會導致級聯故障,進而造成整個系統不可用,這種現象被稱之為服務雪崩效應。
服務雪崩效應是一種因“服務提供者”的不可用導致“服務消費者”的不可用,並將不可用逐級放大的過程。
特點
Hystrix主要有如下特點:
-
包裹請求:使用HystrixCommand(或HystrixObservableCommand)包裹對依賴的呼叫邏輯,每個命令在獨立執行緒中執行。這是用到了設計模式中的“命令模式”。
-
跳閘機制:當某服務的錯誤率超過一定閾值時(或者訊號量)。如果該執行緒池已滿,發往該依賴的請求就被立即拒絕,從而不是排隊等候,從而加速失敗判定。
-
監控:Hystrix可以近乎實時地監控執行指標和配置的變化,例如成功、失敗、超時、以及被拒絕的請求等。
-
回退機制:當請求失敗、超時、被拒絕,或當斷路器開啟時,執行回退邏輯。回退邏輯可由開發人員自行提供,例如返回一個預設值。
-
自我修復:斷路器開啟一段時間後,會自動進入“半開”狀態。斷路器開啟、關閉、半開的邏輯轉換。
Hystrix的使用
在springcloud-goods-order中新增Hystrix依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency>
在OrderApplication中啟用Hystrix
@EnableHystrix
在ItemService中新增容錯處理方法:
/**
* 呼叫商品的務提供的介面進行查詢資料
* @param id
* @return
*/
@HystrixCommand(fallbackMethod = "queryItemByIdFallbackMethod") //進行容錯處理
public Item queryItemById(Long id){
return this.itemFeignClient.queryItemById(id);
}
public Item queryItemByIdFallbackMethod(Long id){ //請求失敗執行的方法
return new Item(id,"查詢商品資訊出錯!",null,null,null);
}
當請求的商品微服務掛掉時,會觸發Hystrix中自定義的回撥函式queryItemByIdFallbackMethod
,自己通過返回一個新的空Item物件,來保證訂單微服務不會因為商品微服務掛掉後,自己也被連帶掛掉的情況。
這裡需要注意的是,queryItemByIdFallbackMethod()方法的名稱,必須與fallbackMethod中的值相一致,同時其返回型別還必須得相同。
比如說當我們手動停掉所有的商品微服務後,再次訪問訂單微服務的介面時
http://127.0.0.1:8082/order/13135351635
其響應的結果如下,從這裡,我們可以看出,儘管說我們請求不到商品微服務中的商品條目資訊了,但是我們對於訂單微服務的請求仍然是正常執行的,這說明我們的Hystrix現在已經能夠正常的使用了。
{
"orderId": "13135351635",
"userId": 1,
"createDate": 1544677668861,
"updateDate": 1544677668861,
"orderDetails": [
{
"orderId": "13135351635",
"item": {
"id": 1,
"title": "查詢商品資訊出錯!",
"pic": null,
"desc": null,
"price": null
}
},
{
"orderId": "13135351635",
"item": {
"id": 2,
"title": "查詢商品資訊出錯!",
"pic": null,
"desc": null,
"price": null
}
}
]
}