「 從0到1學習微服務SpringCloud 」13 斷路器Hystrix

背景與功能

在微服務架構中,不少狀況下,各個服務之間是相互依賴,一個服務可能會調用了好幾個其餘服務,假設其中有一個服務故障,便會產生級聯故障,最終致使整個系統崩潰沒法使用(這稱爲雪崩效應),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

image

細節

若方法中出現異常時或在超時時間(默認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 訪問成功(用於對比參照)

image

2.在10秒內(rolling window),調用http://localhost:8080/hys/circuitSayHi10次(咱們設置錯誤率爲60%) 由於開始調用時不必定就在一個rolling window開頭,因此咱們調用10次,確定會觸發熔斷

3.而後調用
http://localhost:8080/hys/circuitSayHi?number=2,處在斷路狀態,仍然調用的是回調函數

image

配置的使用

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

image

4.分別調用一下

http://localhost:8080/hys/circuitSayHi?number=2
http://localhost:8080/hys/circuitSayHi

image

在監控的界面有兩個重要的圖形信息:一個實心圓和一條曲線。

  • 實心圓:一、經過顏色的變化表明了實例的健康程度,健康程度從綠色、黃色、橙色、紅色遞減。二、經過大小表示請求流量發生變化,流量越大該實心圓就越大。因此能夠在大量的實例中快速發現故障實例和高壓實例。

  • 曲線:用來記錄2分鐘內流浪的相對變化,能夠經過它來觀察流量的上升和降低趨勢。

就講到這裏咯,已同步更新github,下期見~
https://github.com/zhangwenkang0/springcloud-learning-from-0-to-1

若是以爲不錯,分享給你的朋友!

一個立志成大腿而天天努力奮鬥的年輕人

伴學習伴成長,成長之路你並不孤單!

掃描二維碼,關注公衆號

相關文章
相關標籤/搜索