
本文,我們來學(xué)習(xí)斷路器。斷路器在軟件設(shè)計模式中,當(dāng)一個服務(wù)影響到另一個服務(wù)時常被用到。如果你對電子電器工程有一定了解到話,一定聽過斷路或微型斷路器。

這基本上是一個電子開關(guān),用來保護我們的家庭電器設(shè)備。當(dāng)電路出現(xiàn)異常時,它就會切換以保護整個電路。這種斷路的概念類似于我們在軟件世界中使用的概念,在軟件世界中,服務(wù)實際上與許多其他服務(wù)進(jìn)行交互。讓我們舉個例子來理解它到底是什么。

假設(shè)有3個微服務(wù),并且這3個微服務(wù)之間相互同步通信。當(dāng)向微服務(wù)1發(fā)送一個請求,微服務(wù)1將調(diào)用微服務(wù)2進(jìn)一步的微服務(wù)2會調(diào)用微服務(wù)3。如果所有服務(wù)正常的話,請求結(jié)果會從微服務(wù)3返回給微服務(wù)2,然后到微服務(wù)1。但可能有一些服務(wù)不可用。并非所有的服務(wù)都是可用的。
如果微服務(wù)3故障了將會發(fā)生什么?

請求將發(fā)送到微服務(wù)1和微服務(wù)2,當(dāng)請求到微服務(wù)3會返回錯誤。現(xiàn)在,微服務(wù)2將接收到錯誤并將錯誤返回給微服務(wù)1,最后客戶端接收到一個錯誤響應(yīng)。這并不合適,因為客戶端不想要接收到錯誤。需要以更合適的方式處理。也可能有其他的問題,如果微服務(wù)2有重試機制的話為了獲得正常響應(yīng)會向微服務(wù)3發(fā)送多次重試請求。假如微服務(wù)2重試5次。當(dāng)微服務(wù)3因負(fù)載過重而返回錯誤的話,重試會導(dǎo)致微服務(wù)3返回更多錯誤。因此這里需要更好的方式處理。
如何讓服務(wù)變得更好?
讓我們向這個請求路徑中添加斷路器。假設(shè)我們在每個微服務(wù)中都實現(xiàn)了斷路器。斷路器有3種方式可以實現(xiàn)服務(wù)正常響應(yīng)。
緩存響應(yīng)

當(dāng)請求發(fā)送到微服務(wù)1,然后發(fā)送到微服務(wù)2最后到微服務(wù)3?,F(xiàn)在微服務(wù)2知道微服務(wù)3出現(xiàn)異常。微服務(wù)2中的斷路器知道微服務(wù)3返回錯誤。斷路器會將緩存中的響應(yīng)返回。這意味著,每當(dāng)我們從服務(wù)接收到錯誤時,我們可以配置斷路器以返回緩存中的響應(yīng)。緩存中的響應(yīng)是之前請求成功的響應(yīng)或服務(wù)沒有故障時緩存的響應(yīng)。因此,現(xiàn)在當(dāng)服務(wù)失敗時,我們實際上會得到緩存的響應(yīng)。用戶可以通過緩存響應(yīng)接收返回碼為200的成功響應(yīng)。
回退機制
不返回緩存的響應(yīng),可以將發(fā)送到微服務(wù)3的請求重定向到其他類似的服務(wù)上進(jìn)行處理。請求重定向到類似微服務(wù)3,就可以從第三方服務(wù)獲得成功的響應(yīng),而不會得到任何錯誤。因此,當(dāng)實際服務(wù)失敗時,我們可以使用另一個服務(wù)替代故障服務(wù)。
修復(fù)機制

這里當(dāng)一個請求來臨時,微服務(wù)斷路器保留微服務(wù)3的失敗次數(shù)。在達(dá)到給定的失敗次數(shù)之后,我們可以告訴微服務(wù)2上的斷路器,停止向微服務(wù)3發(fā)送請求。讓它恢復(fù)一段時間。我們也可以配置恢復(fù)時間。在此之后,任何針對微服務(wù)2的請求都不會調(diào)用微服務(wù)3,直到定義的時間間隔結(jié)束。現(xiàn)在我們可以使用緩存響應(yīng)或回退機制返回響應(yīng)??梢詳嚅_微服務(wù)3并讓它恢復(fù)。
如何才能恢復(fù)?
- 如果隊列中有任何等待的請求,它等待處理并結(jié)束。
- 可以關(guān)閉故障服務(wù)并部署一個新實例,或者配置啟動一個新實例。
超過恢復(fù)時間后會如何?
在某個超時后,微服務(wù)2將調(diào)用微服務(wù)3并檢查響應(yīng)如何。 如果仍然失敗,微服務(wù)2將繼續(xù)返回緩存響應(yīng)或使用回退機制。如果請求成功,那么微服務(wù)2緩存成功響應(yīng),并將響應(yīng)返回給微服務(wù)1,并保持正確的請求路徑。
線路圖
- Closed:當(dāng)一切正常,斷路器處于關(guān)閉狀態(tài),所有請求經(jīng)過服務(wù)。當(dāng)請求失敗次數(shù)超出閾值時,斷路器觸發(fā)處于Open狀態(tài)。
- Open:斷路器在不執(zhí)行函數(shù)的情況下對調(diào)用返回一個錯誤。
-
Half-Open:經(jīng)過一個超時時間后,電路切換到半開狀態(tài),以測試潛在問題是否仍然存在。如果在這種半開狀態(tài)下單個調(diào)用失敗,斷路器將再次觸發(fā)。如果調(diào)用成功,斷路器復(fù)位到正常關(guān)閉狀態(tài)。
如果微服務(wù)一切正常,斷路器就處于Closed狀態(tài)。如果現(xiàn)在微服務(wù)3失敗,鏈路與微服務(wù)3斷開連接,進(jìn)入Open狀態(tài)并開始返回緩存響應(yīng)。經(jīng)過一段延遲之后,再次調(diào)用微服務(wù)3,并進(jìn)入半開狀態(tài),這實際是檢查微服務(wù)3是否返回一個成功的響應(yīng)。如果它返回一個成功的響應(yīng),可以進(jìn)入Closed狀態(tài),如果仍然返回一個錯誤,我們可以進(jìn)入Open狀態(tài)。這是斷路器的整個狀態(tài)轉(zhuǎn)移過程。
