天天看點

【服務熔斷】服務熔斷完整說明

文章目錄

    • 1.創始人文檔
    • 2.熔斷機制
    • 3.原理總結
    • 4.斷路器打開之後
    • 5.服務監控hystrixDashboard
      • a.七色
      • b.一圈
      • c.一線
      • d.單個圖說明
      • e.多個圖說明

1.創始人文檔

大神文檔

2.熔斷機制

熔斷機制概述

熔斷機制是應對雪崩效應的一種微服務鍊路保護機制。當扇對外連結路的某個微服務出錯不可用或者響應時間太長時,

會進行服務的降級,進而熔斷該節點微服務的調用,快速傳回錯誤的響應資訊。

當檢測到該節點微服務調用響應正常後,恢複調用鍊路。

在Spring Cloud架構裡,熔斷機制通過Hystrix實作。Hystrix會監控微服務間調用的狀況,

當失敗的調用到一定門檻值,預設是5秒内20次調用失敗,就會啟動熔斷機制。熔斷機制的注解是@HystrixCommand

【服務熔斷】服務熔斷完整說明

3.原理總結

【服務熔斷】服務熔斷完整說明

官網斷路器流程圖

【服務熔斷】服務熔斷完整說明

4.斷路器打開之後

1:再有請求調用的時候,将不會調用主邏輯,而是直接調用降級fallback。通過斷路器,實作了自動地發現錯誤并将降級邏輯切換為主邏輯,減少響應延遲的效果。

2:原來的主邏輯要如何恢複呢?

對于這一問題,hystrix也為我們實作了自動恢複功能。

當斷路器打開,對主邏輯進行熔斷之後,hystrix會啟動一個休眠時間窗,在這個時間窗内,降級邏輯是臨時的成為主邏輯,

當休眠時間窗到期,斷路器将進入半開狀态,釋放一次請求到原來的主邏輯上,如果此次請求正常傳回,那麼斷路器将繼續閉合,

主邏輯恢複,如果這次請求依然有問題,斷路器繼續進入打開狀态,休眠時間窗重新計時。

@HystrixCommand的所有配置

//========================All
@HystrixCommand(fallbackMethod = "str_fallbackMethod",
        groupKey = "strGroupCommand",
        commandKey = "strCommand",
        threadPoolKey = "strThreadPool",

        commandProperties = {
                // 設定隔離政策,THREAD 表示線程池 SEMAPHORE:信号池隔離
                @HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"),
                // 當隔離政策選擇信号池隔離的時候,用來設定信号池的大小(最大并發數)
                @HystrixProperty(name = "execution.isolation.semaphore.maxConcurrentRequests", value = "10"),
                // 配置指令執行的逾時時間
                @HystrixProperty(name = "execution.isolation.thread.timeoutinMilliseconds", value = "10"),
                // 是否啟用逾時時間
                @HystrixProperty(name = "execution.timeout.enabled", value = "true"),
                // 執行逾時的時候是否中斷
                @HystrixProperty(name = "execution.isolation.thread.interruptOnTimeout", value = "true"),
                // 執行被取消的時候是否中斷
                @HystrixProperty(name = "execution.isolation.thread.interruptOnCancel", value = "true"),
                // 允許回調方法執行的最大并發數
                @HystrixProperty(name = "fallback.isolation.semaphore.maxConcurrentRequests", value = "10"),
                // 服務降級是否啟用,是否執行回調函數
                @HystrixProperty(name = "fallback.enabled", value = "true"),
                // 是否啟用斷路器
                @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
                // 該屬性用來設定在滾動時間窗中,斷路器熔斷的最小請求數。例如,預設該值為 20 的時候,
                // 如果滾動時間窗(預設10秒)内僅收到了19個請求, 即使這19個請求都失敗了,斷路器也不會打開。
                @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "20"),
                // 該屬性用來設定在滾動時間窗中,表示在滾動時間窗中,在請求數量超過
                // circuitBreaker.requestVolumeThreshold 的情況下,如果錯誤請求數的百分比超過50,
                // 就把斷路器設定為 "打開" 狀态,否則就設定為 "關閉" 狀态。
                @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),
                // 該屬性用來設定當斷路器打開之後的休眠時間窗。 休眠時間窗結束之後,
                // 會将斷路器置為 "半開" 狀态,嘗試熔斷的請求指令,如果依然失敗就将斷路器繼續設定為 "打開" 狀态,
                // 如果成功就設定為 "關閉" 狀态。
                @HystrixProperty(name = "circuitBreaker.sleepWindowinMilliseconds", value = "5000"),
                // 斷路器強制打開
                @HystrixProperty(name = "circuitBreaker.forceOpen", value = "false"),
                // 斷路器強制關閉
                @HystrixProperty(name = "circuitBreaker.forceClosed", value = "false"),
                // 滾動時間窗設定,該時間用于斷路器判斷健康度時需要收集資訊的持續時間
                @HystrixProperty(name = "metrics.rollingStats.timeinMilliseconds", value = "10000"),
                // 該屬性用來設定滾動時間窗統計名額資訊時劃分"桶"的數量,斷路器在收集名額資訊的時候會根據
                // 設定的時間窗長度拆分成多個 "桶" 來累計各路徑成本,每個"桶"記錄了一段時間内的采集名額。
                // 比如 10 秒内拆分成 10 個"桶"收集這樣,是以 timeinMilliseconds 必須能被 numBuckets 整除。否則會抛異常
                @HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "10"),
                // 該屬性用來設定對指令執行的延遲是否使用百分位數來跟蹤和計算。如果設定為 false, 那麼所有的概要統計都将傳回 -1。
                @HystrixProperty(name = "metrics.rollingPercentile.enabled", value = "false"),
                // 該屬性用來設定百分位統計的滾動視窗的持續時間,機關為毫秒。
                @HystrixProperty(name = "metrics.rollingPercentile.timeInMilliseconds", value = "60000"),
                // 該屬性用來設定百分位統計滾動視窗中使用 “ 桶 ”的數量。
                @HystrixProperty(name = "metrics.rollingPercentile.numBuckets", value = "60000"),
                // 該屬性用來設定在執行過程中每個 “桶” 中保留的最大執行次數。如果在滾動時間窗内發生超過該設定值的執行次數,
                // 就從最初的位置開始重寫。例如,将該值設定為100, 滾動視窗為10秒,若在10秒内一個 “桶 ”中發生了500次執行,
                // 那麼該 “桶” 中隻保留 最後的100次執行的統計。另外,增加該值的大小将會增加記憶體量的消耗,并增加排序百分位數所需的計算時間。
                @HystrixProperty(name = "metrics.rollingPercentile.bucketSize", value = "100"),
                // 該屬性用來設定采集影響斷路器狀态的健康快照(請求的成功、 錯誤百分比)的間隔等待時間。
                @HystrixProperty(name = "metrics.healthSnapshot.intervalinMilliseconds", value = "500"),
                // 是否開啟請求緩存
                @HystrixProperty(name = "requestCache.enabled", value = "true"),
                // HystrixCommand的執行和事件是否列印日志到 HystrixRequestLog 中
                @HystrixProperty(name = "requestLog.enabled", value = "true"),
        },
        threadPoolProperties = {
                // 該參數用來設定執行指令線程池的核心線程數,該值也就是指令執行的最大并發量
                @HystrixProperty(name = "coreSize", value = "10"),
                // 該參數用來設定線程池的最大隊列大小。當設定為 -1 時,線程池将使用 SynchronousQueue 實作的隊列,
                // 否則将使用 LinkedBlockingQueue 實作的隊列。
                @HystrixProperty(name = "maxQueueSize", value = "-1"),
                // 該參數用來為隊列設定拒絕門檻值。 通過該參數, 即使隊列沒有達到最大值也能拒絕請求。
                // 該參數主要是對 LinkedBlockingQueue 隊列的補充,因為 LinkedBlockingQueue
                // 隊列不能動态修改它的對象大小,而通過該屬性就可以調整拒絕請求的隊列大小了。
                @HystrixProperty(name = "queueSizeRejectionThreshold", value = "5"),
        }
)
public String strConsumer() {
    return "hello 2020";
}
public String str_fallbackMethod()
{
    return "*****fall back str_fallbackMethod";
}
 

           

5.服務監控hystrixDashboard

a.七色

【服務熔斷】服務熔斷完整說明

b.一圈

實心圓:共有兩種含義。它通過顔色的變化代表了執行個體的健康程度,它的健康度從綠色<黃色<橙色<紅色遞減。

該實心圓除了顔色的變化之外,它的大小也會根據執行個體的請求流量發生變化,流量越大該實心圓就越大。是以通過該實心圓的展示,就可以在大量的執行個體中快速的發現故障執行個體和高壓力執行個體。

c.一線

曲線:用來記錄2分鐘内流量的相對變化,可以通過它來觀察到流量的上升和下降趨勢。

d.單個圖說明

【服務熔斷】服務熔斷完整說明

e.多個圖說明

【服務熔斷】服務熔斷完整說明

繼續閱讀