天天看點

spring hystrix

上一篇介紹了負載均衡的配置方法,做負載均衡是為了保證高可用性,但是有時候服務提供者挂掉了,比如服務A調用了服務B,服務B又調用了服務C,然後有一天服務C的所有節點都挂掉了,這時服務B就會因為C異常而在不停地等待,服務A又會因為服務B沒響應在不斷地等待,結果請求來得越來越多,使得整個系統雪崩式地出現異常。

為了防止這種情況的出現,我們需要給服務做一些保護的措施,當服務B調用服務C在一定時間内出現同樣的異常,比如在5秒内出現了20次,那麼後面服務B就不要再去調用服務C了,它已經出現問題了,你自己另找辦法吧(比如執行另一個方法或者直接傳回錯誤)。

Hystrix就是用來做熔斷的,它類似于我們家庭電路的保險絲,當服務提供者出現異常導緻無法調用,就會把消費者到提供者這條鍊路給斷掉,不讓用戶端一直等待,保護整個系統。

斷路器功能是在服務消費者上實作的,上一篇介紹了ribbon和feign兩種消費服務方式,本篇也會在分别在這兩種方式上實作。我們仍然在之前的項目添加斷路器的功能。

在service-consumer-ribbon的pom檔案添加Hystrix的依賴

在啟動類添加@EnableHystrix注解

修改RibbonConsumerService類如下

就是添加了一個當斷路後調用的方法,然後在原來的index方法加上@HystrixCommand注解,意思就是先調用遠端的http方法,如果失敗就會去調用indexError方法,起到了斷路的作用

分别啟動單節點注冊中心、單節點服務消費者和ribbon消費者三個項目,通路http://localhost:8080/index?uid=ribbon,可以看到傳回了

然後把服務提供者停止,再次通路http://localhost:8080/index?uid=ribbon,可以看到傳回的是

說明斷路器起作用了

Feign自帶斷路器的,但是在Greenwich版本中預設是關閉的,先在service-consumer-feign的application.properties中添加以下配置

建立一個類FeignConsumerServiceImpl實作FeignConsumerService接口

然後在原來的接口的注解加上fallBack屬性,值就是斷路器類

測試方法和ribbon的一樣,就不再贅述了

Hystrix斷路器還提供了實時監控背景給我們使用——Hystrix Dashboard。

建立一個module,名稱為hystrix-dashboard,添加Spring Web和Hystrix DashBoard依賴,如下:

啟動類添加@EnableHystrixDashboard注解

我們先在ribbon消費者中添加Spring Boot Actuator依賴,如下

接着在application.properties中添加一下配置

因為在Spring Boot 2.X Actuator暴露的端口隻有info和health兩個端點,我們先把所有的端點都開放

依次啟動注冊中心、服務提供者、服務消費者和Hystrix Dashboard,然後通路http://localhost:8888/hystrix,就可以看到Hystrix的界面了

spring hystrix

在界面上我們可以看到斷路器支援預設叢集、指定叢集和單應用,我們這裡隻示範單應用的用法。

在中間輸入http://localhost:8080/actuator/hystrix.stream,然後點選Monitor Stream按鈕,可以看到目前的調用情況

spring hystrix

因為我們還沒有調用任何的服務提供者,是以這裡沒有資料顯示。連續通路http://localhost:8080/index?uid=ribbon後可以看到監控頁面出現調用的資料

spring hystrix

比如這裡的資料是8次成功,0次逾時、錯誤率0.0%,這裡的數字說明對應着右上角不同顔色的提示說明,Circult的狀态為Closed。我們把服務提供者停止,然後連續通路http://localhost:8080/index?uid=ribbon,當服務提供者出錯率達到一定程度(預設是5秒出錯20次),斷路器就會熔斷,Circult的狀态變為Open

spring hystrix

feign中的用法也是一樣的,就不再重複。

斷路器相關的内容介紹到這裡,下一篇介紹網關。

源碼已經上傳到github:https://github.com/spareyaya/spring-cloud-demo/tree/master/chapter4