在微服務架構中,不少狀況下,各個服務之間是相互依賴,一個服務可能會調用了好幾個其餘服務,假設其中有一個服務故障,便會產生級聯故障,最終致使整個系統崩潰沒法使用(這稱爲雪崩效應),Spring Cloud Hystrix正是用來防止雪崩效應的。git
功能:服務降級、服務熔斷、線程和信號隔離、請求緩存、請求合併以及服務監控等強大功能。github
優先核心服務,非核心服務不可用或弱可用 好比:商城的微服架構中,忽然涌入大量流量,但服務器資源是有限的,商品、訂單、支付爲核心服務,必須保證這些服務可用;積分、廣告爲非核心服務,可將其降級爲弱可用或不可用。web
實現邏輯 1.經過HystrixCommand註解指定
2.fallbackMethod(回退函數)中實現具體降級邏輯spring
**代碼實現(使用eureka-client項目) ** 1.將config相關配置註釋掉(不想多開個服務呀)瀏覽器
2.添加maven緩存
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
3.啓動類加上@EnableCircuitBreaker註解服務器
4.新建一個controller作測試架構
//添加Hystrix的註解,並指定回調函數 @HystrixCommand(fallbackMethod = "fallback") @RequestMapping("/hys/hi") public String sayHi(){ return hiService.hi(); } /** * 上面方法指定的回調函數 * 當上面的方法出現異常或在指定時間未返回時(默認超時時間1s),會調用此函數 * @return */ public String fallback(){ return "用戶擁擠,請稍後再試!"; }
5.啓動eureka-server,eureka-client項目,故意不開啓service-hi項目,上面例子中調用hiService.hi()失敗,會發生服務降級,調用回調函數app
6.測試
瀏覽器輸入http://localhost:8080/hys/himaven
若方法中出現異常時或在超時時間(默認1s)內未返回時,會調用回調函數,實現降級處理。
**須要注意:**這裏有個超時時間,Hystrix默認1s,這個須要根據實際業務設置,能夠經過一下註解進行設置
@HystrixCommand(commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value="3000") },fallbackMethod = "fallback")
Hystrix會自動實現依賴隔離,這裏所指的依賴隔離是線程池隔離。
Hystrix會爲每個@HystrixCommand註解的方法建立一個線程池,這樣的話,當某個方法有線程延遲時,也不會影響到其餘的方法。
服務熔斷的原理就好像咱們家裏的電閘同樣,當電流過大,爲了保護電器,會出現跳閘的現象。
服務熔斷也是同樣,當遇到不斷地出現異常的情況時,達到某個閾值時會觸發熔斷,而降級調用回調函數。
@HystrixCommand(commandProperties = { //開啓熔斷 @HystrixProperty(name = "circuitBreaker.enabled",value="true"), //一個rolling window內最小的請求數。 默認20 // 若是設爲20,那麼當一個rolling window(統計時間段,默認10s)的時間內收到19個請求,即便19個請求都失敗,也不會觸發circuit break(熔斷)。 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value="10"), //觸發短路的時間值,當該值設爲5000時,則當觸發circuit break後的5000毫秒內都會拒絕request,也就是5000毫秒後纔會關閉circuit(斷路器)。默認5000 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value="10000"), //錯誤比率閥值,若是錯誤率>=該值,circuit(斷路器)會被打開,並短路全部請求觸發fallback。默認50 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value="60") },fallbackMethod = "fallback") @GetMapping("/hys/circuitSayHi") public String circuitSayHi(Integer number){ if(number == 2){ return "success"; } return hiService.hi(); } public String fallback(Integer number){ return "用戶擁擠,請稍後再試!"; }
測試
背景:當我傳遞參數number=2的時,服務調用是成功的,不然失敗(因service-hi不開啓)
1.直接調用
http://localhost:8080/hys/circuitSayHi?number=2 訪問成功(用於對比參照)
2.在10秒內(rolling window),調用http://localhost:8080/hys/circuitSayHi10次(咱們設置錯誤率爲60%) 由於開始調用時不必定就在一個rolling window開頭,因此咱們調用10次,確定會觸發熔斷
3.而後調用
http://localhost:8080/hys/circuitSayHi?number=2,處在斷路狀態,仍然調用的是回調函數
hystrix: command: default: circuitBreaker: #開啓熔斷 enabled: true #滾動窗口中將使斷路器跳閘的最小請求數量 requestVolumeThreshold: 20 #設置失敗百分比的閾值。若是失敗比率超過這個值,則斷路器跳閘而且進入fallback邏輯 errorThresholdPercentage : 60 execution: isolation: thread: #設置調用者執行的超時時間(單位毫秒) timeoutInMilliseconds: 2000 #爲某個方法設定特殊的配置 方法名 circuitSayHi: circuitBreaker: #開啓熔斷 enabled: true #滾動窗口中將使斷路器跳閘的最小請求數量 requestVolumeThreshold: 10 #設置失敗百分比的閾值。若是失敗比率超過這個值,則斷路器跳閘而且進入fallback邏輯 errorThresholdPercentage : 40 execution: isolation: thread: #設置調用者執行的超時時間(單位毫秒) timeoutInMilliseconds: 1000
更多配置項,自定谷歌百度
Hystrix提供了一個圖形化界面,用於監控斷路狀況
1.添加maven
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency>
2.添加配置
management: endpoints: web: exposure: # 開啓指定端點 include: 'hystrix.stream'
3.重啓項目,打開 http://localhost:8080/hystrix
4.分別調用一下
http://localhost:8080/hys/circuitSayHi?number=2
http://localhost:8080/hys/circuitSayHi
在監控的界面有兩個重要的圖形信息:一個實心圓和一條曲線。
實心圓:一、經過顏色的變化表明了實例的健康程度,健康程度從綠色、黃色、橙色、紅色遞減。二、經過大小表示請求流量發生變化,流量越大該實心圓就越大。因此能夠在大量的實例中快速發現故障實例和高壓實例。
曲線:用來記錄2分鐘內流浪的相對變化,能夠經過它來觀察流量的上升和降低趨勢。
就講到這裏咯,已同步更新github,下期見~
https://github.com/zhangwenkang0/springcloud-learning-from-0-to-1
若是以爲不錯,分享給你的朋友!
一個立志成大腿而天天努力奮鬥的年輕人
伴學習伴成長,成長之路你並不孤單!