Hystrix已經中止開發,官方推薦替代項目Resilience4j

隨着微服務的流行,熔斷做爲其中一項很重要的技術也廣爲人知。當微服務的運行質量低於某個臨界值時,啓動熔斷機制,暫停微服務調用一段時間,以保障後端的微服務不會由於持續過負荷而宕機。本文介紹了新一代熔斷器Resilience4j如何使用。git

 

 

譯者注:Hystrix官方已經中止開發了,Hystrix官方推薦使用新一代熔斷器做爲Resilience4j。做爲新一代的熔斷器,Resilience4j有不少優點,好比依賴少,模塊化程度較好等優點。本文是關於resilience4j的初學者指南。github


resilience4j是受Hystrix啓發而作的熔斷器,經過管理遠程調用的容錯處理來幫助實現一個健壯的系統。resilience4j提供了更好用的API,而且提供了不少其餘功能好比Rate Limiter(限流器),Bulkhead(艙壁隔離)。spring

 

設置Maven

 

添加依賴以下:後端

這裏僅僅添加了熔斷器模塊,其餘模塊能夠點擊這裏[1]。緩存

 

熔斷器

 

使用這部分功能,須要引入上文所述的依賴。熔斷器模式能夠幫助咱們在遠程服務出故障時防止故障級聯。

在屢次請求失敗後,咱們就認爲服務不可用/超載,而且對以後的請求進行短路處理,這樣咱們就能節約系統資源。

咱們看看resilience4j如何作到這一點。

首先須要定義使用的設置,咱們先使用默認設置:服務器

固然你也能夠自定義一些參數:併發

這裏咱們設置ratethreshold爲20%,最小5次重試。

而後咱們建立一個熔斷器對象,並調用遠程服務:框架

經過junit進行測試,咱們會調用服務10次,能夠驗證服務至少調用5次,若是有20%的失敗的狀況下,會中止調用。maven

 

熔斷器狀態及設置

 

熔斷器有三種可能狀態:模塊化

  • 關閉— 服務正常,不須要進行短路

  • 打開— 遠程服務宕機,全部請求都短路

  • 半開— 進入打開狀態一段時間後,熔斷器容許檢查遠程服務是否恢復

能夠作如下設置:

  • 熔斷器進入打開狀態的閾值

  • 等待時間,即熔斷器進入打開狀態到半開狀態須要等待的時間

  • 熔斷器半開或者閉合時,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,由方圓翻譯。

相關文章
相關標籤/搜索