Hystrix已經停止開發,官方推薦替代專案Resilience4j
隨著微服務的流行,熔斷作為其中一項很重要的技術也廣為人知。當微服務的執行質量低於某個臨界值時,啟動熔斷機制,暫停微服務呼叫一段時間,以保障後端的微服務不會因為持續過負荷而宕機。本文介紹了新一代熔斷器Resilience4j如何使用。
譯者注:Hystrix官方已經停止開發了,Hystrix官方推薦使用新一代熔斷器作為Resilience4j。作為新一代的熔斷器,Resilience4j有很多優勢,比如依賴少,模組化程度較好等優勢。本文是關於resilience4j的初學者指南。
resilience4j是受Hystrix啟發而做的熔斷器,通過管理遠端呼叫的容錯處理來幫助實現一個健壯的系統。resilience4j提供了更好用的API,並且提供了很多其他功能比如Rate Limiter(限流器),Bulkhead(艙壁隔離)。
設定Maven
新增依賴如下:
這裡僅僅添加了熔斷器模組,其他模組可以點選這裡[1]。
熔斷器
使用這部分功能,需要引入上文所述的依賴。熔斷器模式可以幫助我們在遠端服務出故障時防止故障級聯。
在多次請求失敗後,我們就認為服務不可用/超載,並且對之後的請求進行短路處理,這樣我們就能節約系統資源。
我們看看resilience4j如何做到這一點。
首先需要定義使用的設定,我們先使用預設設定:
當然你也可以自定義一些引數:
這裡我們設定ratethreshold為20%,最小5次重試。
然後我們建立一個熔斷器物件,並呼叫遠端服務:
通過junit進行測試,我們會呼叫服務10次,可以驗證服務至少呼叫5次,如果有20%的失敗的情況下,會停止呼叫。
熔斷器狀態及設定
熔斷器有三種可能狀態:
-
關閉— 服務正常,不需要進行短路
-
開啟— 遠端服務宕機,所有請求都短路
-
半開— 進入開啟狀態一段時間後,熔斷器允許檢查遠端服務是否恢復
可以做以下設定:
-
熔斷器進入開啟狀態的閾值
-
等待時間,即熔斷器進入開啟狀態到半開狀態需要等待的時間
-
熔斷器半開或者閉合時,ring buffer的大小
-
處理自定義事件的監聽器
-
自定義謂詞,用於評估異常是否應算作故障,從而提高故障率
限流器
這裡需要引入resilience4j-ratelimiter[2]依賴。可以允許限制對某些服務的訪問。
所有對decorateFunction的呼叫都符合rate limiter.
我們可以配置引數如下:
-
limit重新整理週期
-
重新整理週期的許可權限制
-
預設等待許可權持續時間
艙壁隔離
這裡需要引入resilience4j-bulkhead[3]依賴。可以限制對特定服務的併發呼叫數。
讓我們看一個使用Bulkhead API配置併發呼叫的示例:
為了測試,我們可以呼叫一個mock服務的方法。這種情況下,我們就不允許其他呼叫:
我們可以做如下設定:
-
允許的最大並行數
-
執行緒等待的最大時間
重試
需要引入resilience4j-retry[4]庫。可以在呼叫失敗後自動重試:
現在我們模擬遠端呼叫失敗,並確認自動重試:
我們可以做如下設定:
-
最大嘗試數
-
重試前等待時間
-
自定義函式,用於修改故障後的等待間隔。
-
自定義謂詞,用於評估異常是否應重試
快取
cache模組需要引入resilience4j-cache[5]依賴。初始化程式碼與眾不同:
這裡的快取是通過使用的JSR-107 Cache實現完成的,Resilience4j提供了使用快取的方法。
請注意,沒有用於裝飾功能的API(如Cache.decorateFunction(Function)),API僅支援Supplier和Callable型別。
限時器
該模組需要引入resilience4j-timelimiter[6]依賴。可以使用TimeLimiter限制呼叫遠端服務所花費的時間。
我們設定超時時間為1毫秒的TimeLimiter:
使用Future.get()驗證是否如預期超時:
可以和熔斷器組合使用:
附加模組
Resilience4j還提供了許多附加模組,可以簡化與流行框架和庫的整合。
一些比較知名的整合是:
-
Spring Boot - resilience4j-spring-boot模組
-
Ratpack - resilience4j-ratpack模組
-
Retrofit - resilience4j-Retrofit模組
-
Vertx - resilience4j-vertx模組
-
Dropwizard - resilience4j-metrics模組
-
Prometheus - resilience4j-prometheus模組
結論
在本文中,我們瞭解了Resilience4j庫的不同方面,並學習瞭如何使用它來解決伺服器間通訊中的各種容錯問題。原始碼和更多示例可以在這裡[5]找到。
文中連結:
[1]https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22io.github.resilience4j%22
[2]https://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22resilience4j-ratelimiter%22
[3]https://search.maven.org/classic/#search%7Cga%7C1%7Cresilience4j-bulkhead
[4]https://search.maven.org/classic/#search%7Cga%7C1%7Cresilience4j-retry
[5]https://search.maven.org/classic/#search%7Cga%7C1%7Cresilience4j-cache
[6]https://search.maven.org/classic/#search%7Cga%7C1%7Cresilience4j-timelimiter
[7]https://github.com/eugenp/tutorials/tree/master/libraries
原文地址:
https://www.baeldung.com/resilience4j
本文作者baeldung,由方圓翻譯。