天天看點

Spring Cloud中的斷路器Hystrix

舉個簡單的例子,做一個使用者管理項目,裡邊就三個功能:使用者注冊、使用者登入、使用者詳情浏覽。按照傳統的軟體開發方式直接建立一個Web項目,分分鐘就把這三個功能開發出來了,但是我現在想使用微服務+服務治理的方式來開發:首先我将這個項目拆分為四個微服務,四個微服務各建一個子產品,分别是使用者注冊子產品、使用者登入子產品、使用者詳情浏覽子產品和資料庫操作子產品,這四個子產品通過内部服務治理互相調用。但是現在存在一個問題,這四個子產品通過服務注冊與訂閱的方式互相依賴,如果一個子產品出現故障會導緻依賴它的子產品也發生故障進而發生故障蔓延,進而導緻整個服務的癱瘓。比如說這裡的登入子產品依賴于資料庫子產品,如果資料庫子產品發生故障,那麼當登入子產品去調用資料庫子產品的時候可能得不到響應,這個調用的線程被挂起,如果處于高并發的環境下,就會導緻登入子產品也崩潰。當一個系統劃分的子產品越多,這種故障發生的頻率就會越高,對于這個問題,Spring Cloud中最重要的解決方案就是斷路器,那麼本文我們就來看看什麼是斷路器。

首先我們分别啟動服務注冊中心,再啟動兩個服務提供者的執行個體,端口号分别是8080和8081,然後再啟動一個服務消費者,服務消費者的端口号為9000,這幾個都啟動成功之後,我們通路<code>http://localhost:9000/ribbon-consumer</code>這個位址,可以看到如下效果:

此時我們關閉掉任意一個服務提供者,再去通路這個位址,會看到如下效果:

大家知道Spring Cloud中采取的預設負載均衡政策就是輪詢,是以當一個服務提供者關掉之後,重新整理的時候服務請求成功和請求失敗是成對出現的:當服務消費者去請求那個被關掉的服務提供者的時候就會請求失敗,當服務消費者去請求正常的服務提供者時就能獲得期望的結果。請求失敗時不能給使用者展示這樣一個ErrorPage,而應該是一個可控的頁面,OK,我們來看看如何使用斷路器來解決這個問題。

服務消費者中加入斷路器

首先我們需要在服務消費者中引入hystrix,如下:

修改服務消費者啟動入口類

引入hystrix之後,我們需要在入口類上通過@EnableCircuitBreaker開啟斷路器功能,如下:

我們也可以使用一個名為@SpringBootApplication的注解代替這三個注解,@SpringBootApplication注解的定義如下:

實際上就是這三個注解的一個整合。

修改Controller

然後我們建立一個HelloService類,如下:

關于這個HelloService類我說如下幾點:

OK,最後我們将ConsumerController的邏輯修改成下面這樣:

此時我們就開啟了斷路器功能。

測試

OK,小夥伴們看到,此時如果服務調用失敗,就會調用失敗的那個回調方法。

事實上,不僅僅是服務提供者被關閉時我們需要斷路器,如果請求逾時也會觸發熔斷請求,調用回調方法傳回資料。