Hystrix是什麼東西?百度一下:
沒錯,hystrix是豪豬的意思,作爲SpringCloud微服務系統中保持服務穩定的重要組件,正如它的名字一樣,它對整個系統起到了保護的作用。
在許多文章當中把hystrix描述爲熔斷器,便於我們結合生活來理解。想象一下,你在家使用了很多的大功率的電器,導致電路的壓力很大,當達到
一個臨界值的時候,就會跳閘。而在一個龐大的微服務系統中,有幾十上百個服務同時運行,如果因爲一個服務故障導致整個系統崩潰,這是不可想象的,
所以有了hystrix,用於出現故障的時候提供服務降級,服務熔斷,服務監控等手段來保護系統。
下面我們就來簡單的介紹一下hystrix如何使用。
依賴引入
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
基本在SpringCloud中使用任何一個功能都需要引入依賴,比如服務發現,統一配置,網關,服務追蹤等等。
基本使用
啓動類加註解
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
加上註解後我們就可以使用hystrix,這裏我提供一個場景:
現有訂單服務和商品服務兩個服務,訂單服務調用商品服務的商品列表接口,我們通過這個服務之間的調用來看兩種hystrix的應用:服務降級和服務熔斷。
先說服務降級,服務降級是什麼呢?
我們去菜市買肉,一開始呢,我想吃牛肉,於是問老闆有沒有牛肉,老闆說沒有;然後我降低檔次,選擇豬肉,還是沒有;最後買了雞肉。這就是一個
降級的過程,老闆對我提供服務,當不能滿足我的請求的時候,他會告訴我沒有。如果沒有做服務降級,那麼當我問老闆的時候,老闆直接不鳥我,這種就是
服務態度惡劣,很垃圾的服務。
對應到微服務體系中,就是說當服務不可用或者出現故障的時候需要有應急措施來響應客戶的請求。下面是具體應用,比較簡單,先看未使用服務降級的場景:
當兩個服務都正常運行的時候,不用說,一點兒問題都沒有。然後我們將product服務關閉掉:
直接報500了,這樣對普通用戶很不友好,又不是每一個人都知道httpcode的含義,那怎麼辦呢?有人可能會想到根據httpcode定義不同錯誤提示頁面,這也是
一個是思路,但是根據httpcode只能做到把錯誤抽出來形成幾個公共的提示頁面,而不能每一個接口都返回不同的提示,針對這個問題,我們就可以使用到hystrix的服務
降級功能了。具體步驟是在要做服務降級的接口上加@HystrixCommand註解,並定義服務降級的方法:
1 private String fallback(int id){ 2 return "當前網絡繁忙,請稍後再試哦!" + id; 3 }
在@HystrixCommand註解中指定方法:
這時候再來看order服務調用product服務:
出現了我們想要的提示,這樣對用戶來說,至少比直接返回個錯誤碼或者啥都不返回要強的多吧。。。
接下來再看看服務熔斷,服務熔斷就如我們開篇所說的,就是一個開關,可以預防雪崩問題的出現,不會出現一個服務掛掉拖死N個服務的問題。
我們現在假設訂單服務需要頻繁的調用商品服務,而商品服務由於某種原因出現了單點故障不能訪問mysql,此時訂單服務的請求還在不斷的過來,
這些請求來到商品服務之後執行了商品這邊一大堆的邏輯之後卻發現不能入庫,what fuck?這就很尷尬了對不對,於是乎,熔斷器應運而生。
我們可以在@HystrixCommand中定義請求商品服務是否開啓熔斷器、請求數量閾值,錯誤佔比,超時時間等,具體的可以直接看源碼裏面有那些屬性:
circuitBreaker.enabled:開啓熔斷器
circuitBreaker.requestVolumeThreshold:當請求達到這個數量之後,才進行錯誤佔比的計算。
circuitBreaker.errorThresholdPercentage:錯誤佔比,當錯誤次數超過這個百分比,就會熔斷。
circuitBreaker.sleepWindowInMilliseconds:半打開休眠時間,熔斷之後過了這段休眠時間,就會半打開,嘗試接口是否恢復,如果恢復就完全打開熔斷器。
由於參數比較多,可以放到類上面或者配置文件裏面全局配置:
1 @DefaultProperties(defaultFallback = "fallbackForGlobal", commandProperties = { 2 @HystrixProperty(name = "circuitBreaker.enabled", value = "true"), 3 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), 4 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), 5 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50")})
配置好了嘗試調用接口,當請求10次,如果其中五次都失敗了,那麼該接口就會被熔斷,直接返回服務降級方法鎖返回的。
最後,說下服務監控,就是hystrix提供的web儀表盤(hystrix dashboard),還是老套路,加依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency>
加註解
把SpringBoot的endpoints開啓:
啓動之後訪問http://localhost:8100/hystrix
根據提示輸入地址和title,title就是服務名,我這裏是order
就可以進入這個頁面了
然後我們來幾次錯誤請求:
就會在儀表盤上看到錯誤率這些,具體使用還請各位看官自行根據實踐。
好啦,本文就到此結束了,感謝閱讀本文。