天天看點

Sentinel-DegradeSlot

DegradeSlot是用于服務降級熔斷。

在執行entry的過程中,對于處于熔斷open狀态的情況則判斷是否已經過了熔斷期且設定半開成功,那麼就通過.否則不通過報DegradeException

對于處于降級狀态即half-open的時候,則直接抛出DegradeException.

Sentinel的熔斷器一共有兩種ExceptionCircuitBreaker 和  ResponseTimeCircuitBreaker 都 extends  AbstractCircuitBreaker  implements CircuitBreaker

在上一個之前slot執行過程中,如果發生了非BlockException即一些未知的throw,那麼在exit内會判斷error是否達到配置的erro數量或者錯誤比例。

如果整個調用過程超過了配置的逾時時間 則也會觸發熔斷。

熔斷的目的是将熔斷器的狀态設定到半開或者全開,這樣在tryPass校驗的時候就可以傳回通過或者異常了。

配置面闆如下:

Sentinel-DegradeSlot

根據配置項,可以具體看一下熔斷器的接口 CircuitBreaker

了解了熔斷規則以後,下面将具體闡述熔斷流程。

先看一下這整個熔斷器的狀态轉化圖,其中open到half-open的狀态隻發生在熔斷器檢驗過程

Sentinel-DegradeSlot

在DegradeSlot#entry#performChecking中,先根據資源名稱擷取到所有的熔斷器清單,然後逐個校驗。

這裡面怎麼擷取到熔斷配置,後續在控制台這章會詳細講解,關于頁面上的配置如何在服務中生效。接下來重點看一下tryPass

很好了解,如果熔斷沒開,直接return,如果發現正處于熔斷狀态,這個時候回試圖去判斷熔斷目前時間是否已經過了熔斷期,如果過了熔斷器,那麼嘗試性的将open狀态設定成half_open,如果設定成功,那麼就通過。

在statisticSlot中對于一些非BlockException會設定error,然後在調用exit的時候,傳遞到DegradeSlot#exit的時候,根據情況将會對熔斷器的狀态設定成open。

這邊以ExceptionCircuitBreaker舉例,

1 如果目前資源的熔斷器已經是open,則不做調整。

2 如果是half-open狀态,根據本地調用情況,是否有error來決定設定成close還是更新到熔斷open狀态

3 如果是close狀态,則開始檢驗降級配置,計算異常數或者異常比例,如果超過門檻值則将熔斷器狀态設定到open

注意:對異常數或者慢調用時間都是以滑動時間窗的資料結構來統計的,可參考滑動時間窗算法

實作代碼如下:

繼續閱讀