1. 程式人生 > >Spring Cloud與微服務之Hystrix

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
            }
        }
    ]
}