天天看點

斷路器流程圖

官方流程圖 

斷路器流程圖

 斷路器在什麼情況下開始起作用

斷路器流程圖

 涉及到斷路器的三個重要參數:快照時間窗、請求總數閥值、錯誤百分比閥值。

1:快照時間窗:斷路器确定是否打開需要統計一些請求和錯誤資料,而統計的時間範圍就是快照時間窗,預設為最近的10秒。

2:請求總數閥值:在快照時間窗内,必須滿足請求總數閥值才有資格熔斷。預設為20,意味着在10秒内,如果該hystrix指令的調用次數不足20次,即使所有的請求都逾時或其他原因失敗,斷路器都不會打開。

3:錯誤百分比閥值:當請求總數在快照時間窗内超過了閥值,比如發生了30次調用,如果在這30次調用中,有15次發生了逾時異常,也就是超過50%的錯誤百分比,在預設設定50%閥值情況下,這時候就會将斷路器打開。

斷路器開啟或者關閉的條件 

當滿足一定的閥值的時候(預設10秒内超過20個請求次數)

當失敗率達到一定的時候(預設10秒内超過50%的請求失敗)

到達以上閥值,斷路器将會開啟

當開啟的時候,所有請求都不會進行轉發

斷路器打開之後

其他配置 

//========================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";
}