resilience 4j提供以下功能。
斷路器
ratelimiter
艙壁
重試
高速緩存
timelimiter
如果您打算在spring boot中使用它,可以使用starter。請注意,spring boot 1.x和2.x系列之間的artifactid似乎有所不同。另外,上面只包含circuitbreaker和ratelimiter,在使用其他功能時需要單獨添加依賴項。(由于未準備好autoconfigure,您還需要自己定義bean。)
這次我將總結(jié)如何在spring boot 2.x系列中使用circuitbreaker和ratelimiter。
環(huán)境
jdk 8
spring boot 2.1.2.release
resilience 4j 0.13.2
斷路器
當某些具有微服務的服務發(fā)生故障時,可以臨時阻止對故障服務的訪問并防止故障傳播。
circuitbreaker有三種狀態(tài):closed,open,halfopen。如果是正常的,則它是關閉的,如果處理失敗超過一定數(shù)量,它將變?yōu)榇蜷_并且訪問被阻止。當在打開狀態(tài)下經(jīng)過一段時間后,進入halfopen狀態(tài)。如果處理在halfopen狀態(tài)下失敗超過一定量,則返回到關閉狀態(tài)。
在resilience 4j中,處理的成功和失敗由環(huán)形緩沖器ring bit buffer管理,并且當緩沖器中的故障數(shù)超過設定的速率時,狀態(tài)轉(zhuǎn)變。
斷路器使用狀態(tài)中的ring bit buffer closed來存儲呼叫的成功或失敗狀態(tài)。成功的呼叫存儲為0位,失敗的呼叫存儲為1位。ring bit buffer具有(可配置的)固定大小。環(huán)位緩沖區(qū)在內(nèi)部使用類似數(shù)據(jù)結(jié)構(gòu)的bitset來存儲與布爾數(shù)組相比節(jié)省內(nèi)存的位。bitset使用long []數(shù)組來存儲這些位。這意味著bitset只需要一個包含16個長(64位)值的數(shù)組來存儲1024個調(diào)用的狀態(tài)。
例如,如果環(huán)形緩沖區(qū)的大小為10,則必須至少評估10個調(diào)用,然后才能計算故障率。如果僅評估了9個呼叫,即使所有9個呼叫都失敗,斷路器也不會打開。
用于closed - >; open和halfopen - >; closed判斷的環(huán)形緩沖區(qū)是不同的,可以定義大小,但使用相同的判斷條件(錯誤率)。
在持續(xù)關閉時間結(jié)束后,斷路器狀態(tài)從open更改為half_open并允許調(diào)用以查看后端是否仍然不可用或已再次可用。
斷路器使用另一個(可配置的)環(huán)位緩沖區(qū)來評估half_open狀態(tài)中的故障率。如果故障率高于配置的閾值,則狀態(tài)將更改回open。如果故障率低于或等于閾值,則狀態(tài)變回closed。
此外,處理的成功和失敗由異常判斷。默認情況下,如果任何異常拋出異常,則會將其視為處理失敗,但您也可以指定要將其視為失敗的條件。
設置
application.yml你可以設置定義多個斷路器。
如果你想只考慮一個特定的異常和故障使用recordexceptions,當你不想忽視特定的異常時使用ignoreexceptions。
有兩種方法可以使用spring aop并在函數(shù)中實現(xiàn)它。無論哪種實現(xiàn),如果circuit處于open狀態(tài),它將生成circuitbreakeropenexception。
在以下實現(xiàn)示例中,為簡單起見,它不是微服務。最初resttemplate,我認為這將是service class 調(diào)用其他服務api等使用等的過程。
spring aop實現(xiàn)
通過@circuitbreaker(name = "hogehoge")注釋到類或方法上則可以啟用斷路器。如果在類指定這個注釋,則為所有公共方法啟用斷路器。
如何寫業(yè)務函數(shù)?
調(diào)用端使用斷路器的decorate~方法修飾要調(diào)用的方法。
后備處理
接下來,如果發(fā)生故障,執(zhí)行回退過程怎么辦?在hystrix 的情況下,通過指定@hystrixcommand("hogemethod"),由于resilience4j沒有設置的這樣的功能,必須自己實現(xiàn)。
ratelimiter
您可以限制每單位時間的執(zhí)行次數(shù)。
單位時間是一個周期,并且可以在一個周期中執(zhí)行的數(shù)量是有限的。如果它超過了可以在一個循環(huán)中執(zhí)行的上限,則讓它等待,如果等待時間超過超時時間,則發(fā)生requestnotpermitted。
在application.yml可以定義多個ratelimiter。
它與斷路器實現(xiàn)方式相同,有兩種方法可以使用spring aop并在業(yè)務函數(shù)中編寫它。實現(xiàn)方法也類似于斷路器。
調(diào)用者不用考慮任何事情,只需執(zhí)行該方法即可。
函數(shù)方法:
后備處理,與斷路器一樣,沒有自動執(zhí)行回退處理的機制,因此您需要自己實現(xiàn)它。
單位時間為5秒,超時時間為1秒,每單位時間的執(zhí)行次數(shù)為1。如果同時發(fā)送多個請求,則會發(fā)出失敗請求。(如果您同時請求三個,則至少一個將始終失敗。)
寫在最后:
歡迎留言討論,如需java方面的架構(gòu)資料,我這里剛好有一份,怎么領取→→→關注+轉(zhuǎn)發(fā) 然后私信“架構(gòu)資料” 即可領取
來源:今日頭條
以上是網(wǎng)絡信息轉(zhuǎn)載,信息真實性自行斟酌。