golang 熔斷器的實現過程

2022-09-20 12:45:10 字數 1849 閱讀 3788

目錄

熔斷器像是乙個保險絲。當我們依賴的服務出現問題時,可以及時容錯。一方面可以減少依賴服務對自身訪問的依賴,防止出現雪崩效應;另一方面降低請求頻率以方便上游盡快恢復服務。

熔斷器的應用也非常廣泛。除了在我們應用中,為了請求服務時使用熔斷器外,在 web 閘道器、微服務中,也有非常廣泛的應用。本文將從原始碼角度學習 sony 開源的乙個熔斷器實現

github/sony/gobreaker(**注釋可以從github/lpflpf/gobreaker檢視)

gobreaker是基於《微軟雲設計模式》一書中的熔斷器模式的 golang 實現。有 sony 公司開源,目前 star 數有 1.2k。使用人數較多。

下面是模式定義的乙個狀態機:

熔斷器有三種狀態,四種狀態轉移的情況:

四種狀態轉移:

gobreaker是在上述狀態機的基礎上,實現的乙個熔斷器。

type circuitbreaker struct

其中,如下引數是我們可以自定義的:

熔斷器的執行操作,主要包括三個階段;①請求之前的判定;②服務的請求執行;③請求後的狀態和計數的更新

// 熔斷器的呼叫

func (cb *circuitbreaker) execute(req func() (inte***ce{}, error)) (inte***ce{}, error)

defer func()

}()

// ② 請求和執行

result, err := req()

// ③ 更新計數

cb.afterrequest(generation, err == nil)

return result, err

}請求之前,會判斷當前熔斷器的狀態。如果熔斷器以開啟,則不會繼續請求。如果熔斷器半開,並且已達到最大請求閾值,也不會繼續請求。

func (cb *circuitbreaker) beforerequest() (uint64, error) else if state == statehalfopen && cb.counts.requests >= cb.maxrequests

cb.counts.onrequest()

return generation, nil

}其中當前狀態的計算,是依據當前狀態來的。如果當前狀態為已開啟,則判斷是否已經超時,超時就可以變更狀態到半開;如果當前狀態為關閉狀態,則通過週期判斷是否進入下乙個週期。

func (cb *circuitbreaker) currentstate(now time.time) (state, uint64)

case stateopen:

if cb.expiry.before(now)

} return cb.state, cb.generation

}週期長度的設定,也是以據當前狀態來的。如果當前正常(熔斷器關閉),則設定為乙個 interval 的週期;如果當前熔斷器是開啟狀態,則設定為超時時間(超時後,才能變更為半開狀態)。

每次請求之後,會通過請求結果是否成功,對熔斷器做計數。

func (cb *circuitbreaker) afterrequest(before uint64, success bool)

if success else

}如果在半開的狀態下:

如果請求成功,則會判斷當前連續成功的請求數 大於等於 maxrequests, 則可以把狀態由半開狀態轉移為關閉狀態

如果在半開狀態下,請求失敗,則會直接將半開狀態轉移為開啟狀態

如果在關閉狀態下:

如果請求成功,則計數更新

如果請求失敗,則呼叫readytotrip判斷是否需要將狀態關閉狀態轉移為開啟狀態

總結:

golang微服務熔斷器的使用

熔斷器的基本作用 作為檢查服務是否有效,避免大量請求堵塞在乙個失效請求,如果服務端失效,則會進行降級處理,可以自動進行第乙個介面的請求,如果正常使用,自動進行呼叫第乙個介面 config hystrix.commandconfig 超時配置,此時為了測試,如果超時一秒鐘,則會進行業務 降級處理 如果...

熔斷器熔斷時間標準 正確認識熔斷器的熔斷時間

正確認識熔斷器的熔斷時間 熔斷時間是熔斷器的乙個重要引數,它直接反映了熔斷器的保護功能的強弱,但必須跟所負載的電流相對應,任何乙個負載電流對應熔斷時間的函式關係就形成了熔斷器最重要的效能指標之一 熔斷特性或安秒特性 i t特性 熔斷特性常用的表達方法有兩種 供檢測和驗收依據的i t 反映的則是曲線上...

Hystrix熔斷器(筆記)

當請求的微服務宕機,或者響應時間超時,會觸發熔斷機制,熔斷當前請求。hystrix 是乙個供分布式系統使用,提供延遲和容錯功能,保證複雜的分布系統在面臨不可避免的失敗時,仍能有其彈性。1 依賴 hystrix依賴,主要是用 hystrixcommand org.springframework.clo...