五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網 會員登陸 & 注冊

Java 項目中使用 Resilience4j 框架實現隔斷機制/斷路器

2021-12-01 20:43 作者:信碼由韁  | 我要投稿



到目前為止,在本系列中,我們已經了解了 Resilience4j 及其?[Retry](
https://icodewalker.com/blog/261/),?[RateLimiter](
https://icodewalker.com/blog/288/),?[TimeLimiter](
https://icodewalker.com/blog/302/), 和?[Bulkhead](
https://icodewalker.com/blog/306/)?模塊。在本文中,我們將探索 CircuitBreaker 模塊。我們將了解何時以及如何使用它,并查看一些示例。

代碼示例

本文附有?[GitHub 上](
https://github.com/thombergs/code-examples/tree/master/resilience4j/circuitbreaker)的工作代碼示例。

什么是 Resilience4j?

請參閱上一篇文章中的描述,快速了解?[Resilience4j 的一般工作原理](
https://icodewalker.com/blog/261/#what-is-resilience4j)。

什么是斷路器?

斷路器的思想是,如果我們知道調用可能會失敗或超時,則阻止對遠程服務的調用。我們這樣做是為了不會在我們的服務和遠程服務中不必要地浪費關鍵資源。這樣的退出也給了遠程服務一些時間來恢復。

我們怎么知道一個調用可能會失敗? 通過跟蹤對遠程服務發(fā)出的先前請求的結果。例如,如果前 10 次調用中有 8 次導致失敗或超時,則下一次調用也可能會失敗。

斷路器通過包裝對遠程服務的調用來跟蹤響應。在正常運行期間,當遠程服務成功響應時,我們說斷路器處于“閉合”狀態(tài)。當處于關閉狀態(tài)時,斷路器正常將請求傳遞給遠程服務。

當遠程服務返回錯誤或超時時,斷路器會增加一個內部計數器。如果錯誤計數超過配置的閾值,斷路器將切換到“斷開”狀態(tài)。當處于斷開狀態(tài)時,斷路器立即向調用者返回錯誤,甚至無需嘗試遠程調用。

經過一段配置的時間后,斷路器從斷開狀態(tài)切換到“半開”狀態(tài)。在這種狀態(tài)下,它允許一些請求傳遞到遠程服務以檢查它是否仍然不可用或緩慢。 如果錯誤率或慢呼叫率高于配置的閾值,則切換回斷開狀態(tài)。但是,如果錯誤率或慢呼叫率低于配置的閾值,則切換到關閉狀態(tài)以恢復正常操作。

斷路器的類型

斷路器可以基于計數或基于時間。如果最后 N 次調用失敗或緩慢,則基于計數的斷路器將狀態(tài)從關閉切換為斷開。如果最后 N 秒的響應失敗或緩慢,則基于時間的斷路器將切換到斷開狀態(tài)。在這兩個斷路器中,我們還可以指定失敗或慢速調用的閾值。

例如,如果最近 25 次調用中有 70% 失敗或需要 2 秒以上才能完成,我們可以配置一個基于計數的斷路器來“斷開電路”。同樣,如果過去 30 秒內 80% 的調用失敗或耗時超過 5 秒,我們可以告訴基于時間的斷路器斷開電路。

Resilience4j CircuitBreaker 的概念


resilience4j-circuitbreaker?的工作原理與其他 Resilience4j 模塊類似。我們提供想要作為函數構造執(zhí)行的代碼——一個進行遠程調用的 lambda 表達式或一個從遠程服務中檢索到的某個值的?Supplier,等等——并且斷路器用代碼修飾它 如果需要,跟蹤響應并切換狀態(tài)。

Resilience4j 同時支持基于計數和基于時間的斷路器。

我們使用?slidingWindowType()?配置指定斷路器的類型。此配置可以采用兩個值之一 -
SlidingWindowType.COUNT_BASED?或
SlidingWindowType.TIME_BASED。

failureRateThreshold()?和?slowCallRateThreshold()?以百分比形式配置失敗率閾值和慢速調用率。

slowCallDurationThreshold()?以秒為單位配置調用被認為慢的時間。

我們可以指定一個?minimumNumberOfCalls(),在斷路器可以計算錯誤率或慢速調用率之前需要它。

如前所述,斷路器在一定時間后從斷開狀態(tài)切換到半斷開狀態(tài),以檢查遠程服務的情況。waitDurationInOpenState()?指定斷路器在切換到半開狀態(tài)之前應等待的時間。


permittedNumberOfCallsInHalfOpenState()?配置在半開狀態(tài)下允許的調用次數,
maxWaitDurationInHalfOpenState()?確定斷路器在切換回開狀態(tài)之前可以保持在半開狀態(tài)的時間。

此配置的默認值 0 意味著斷路器將無限等待,直到所有
permittedNumberOfCallsInHalfOpenState()?完成。

默認情況下,斷路器將任何異常視為失敗。但是我們可以對此進行調整,以使用?recordExceptions()?配置指定應視為失敗的異常列表和使用?ignoreExceptions()?配置忽略的異常列表。

如果我們在確定異常應該被視為失敗還是忽略時想要更精細的控制,我們可以提供?Predicate<Throwable>?作為?recordException()?或?ignoreException()?配置。

當斷路器拒絕處于斷開狀態(tài)的呼叫時,它會拋出?CallNotPermittedException。我們可以使用?writablestacktraceEnabled()?配置控制?CallNotPermittedException?的堆棧跟蹤中的信息量。

使用 Resilience4j CircuitBreaker模塊

讓我們看看如何使用
resilience4j-circuitbreaker?模塊中可用的各種功能。

我們將使用與本系列前幾篇文章相同的示例。假設我們正在為一家航空公司建立一個網站,以允許其客戶搜索和預訂航班。我們的服務與?FlightSearchService?類封裝的遠程服務對話。

使用 Resilience4j 斷路器時,CircuitBreakerRegistry、CircuitBreakerConfig?和?CircuitBreaker?是我們使用的主要抽象。

CircuitBreakerRegistry?是用于創(chuàng)建和管理?CircuitBreaker?對象的工廠。

CircuitBreakerConfig?封裝了上一節(jié)中的所有配置。每個?CircuitBreaker?對象都與一個?CircuitBreakerConfig?相關聯。

第一步是創(chuàng)建一個?CircuitBreakerConfig:

CircuitBreakerConfig config = CircuitBreakerConfig.ofDefaults();

這將創(chuàng)建一個具有以下默認值的?CircuitBreakerConfig:

基于計數的斷路器

假設我們希望斷路器在最近 10 次調用中有 70% 失敗時斷開:

CircuitBreakerConfig config = CircuitBreakerConfig ?.custom() ?.slidingWindowType(SlidingWindowType.COUNT_BASED) ?.slidingWindowSize(10) ?.failureRateThreshold(70.0f) ?.build();

然后我們用這個配置創(chuàng)建一個?CircuitBreaker:

CircuitBreakerRegistry registry = CircuitBreakerRegistry.of(config);CircuitBreaker circuitBreaker = registry.circuitBreaker("flightSearchService");

現在讓我們表達我們的代碼以作為?Supplier?運行航班搜索并使用?circuitbreaker?裝飾它:

Supplier<List<Flight>> flightsSupplier = ?() -> service.searchFlights(request); Supplier<List<Flight>> decoratedFlightsSupplier = ?circuitBreaker.decorateSupplier(flightsSupplier);

最后,讓我們調用幾次修飾操作來了解斷路器的工作原理。我們可以使用?CompletableFuture?來模擬來自用戶的并發(fā)航班搜索請求:

for (int i=0; i<20; i++) { ?try { ? ?System.out.println(decoratedFlightsSupplier.get()); ?} ?catch (...) { ? ?// Exception handling ?} }

輸出顯示前幾次飛行搜索成功,然后是 7 次飛行搜索失敗。此時,斷路器斷開并為后續(xù)調用拋出?CallNotPermittedException:

Searching for flights; current time = 12:01:12 884Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... ] Searching for flights; current time = 12:01:12 954Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... ] Searching for flights; current time = 12:01:12 957Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... ] Searching for flights; current time = 12:01:12 958io.reflectoring.resilience4j.circuitbreaker.exceptions.FlightServiceException: Error occurred during flight search ... stack trace omitted ...io.github.resilience4j.circuitbreaker.CallNotPermittedException: CircuitBreaker 'flightSearchService' is OPEN and does not permit further calls ... other lines omitted ...io.reflectoring.resilience4j.circuitbreaker.Examples.countBasedSlidingWindow_FailedCalls(Examples.java:56) ?at io.reflectoring.resilience4j.circuitbreaker.Examples.main(Examples.java:229)

現在,假設我們希望斷路器在最后 10 個調用中有 70% 需要 2 秒或更長時間才能完成:

CircuitBreakerConfig config = CircuitBreakerConfig ?.custom() ?.slidingWindowType(SlidingWindowType.COUNT_BASED) ?.slidingWindowSize(10) ?.slowCallRateThreshold(70.0f) ?.slowCallDurationThreshold(Duration.ofSeconds(2)) ?.build();

示例輸出中的時間戳顯示請求始終需要 2 秒才能完成。在 7 次緩慢響應后,斷路器斷開并且不允許進一步調用:

Searching for flights; current time = 12:26:27 901Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... ] Searching for flights; current time = 12:26:29 953Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... ] Searching for flights; current time = 12:26:31 957Flight search successful ... other lines omitted ... Searching for flights; current time = 12:26:43 966Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... ]io.github.resilience4j.circuitbreaker.CallNotPermittedException: CircuitBreaker 'flightSearchService' is OPEN and does not permit further calls ... stack trace omitted ... ? ? ? ?at io.reflectoring.resilience4j.circuitbreaker.Examples.main(Examples.java:231)io.github.resilience4j.circuitbreaker.CallNotPermittedException: CircuitBreaker 'flightSearchService' is OPEN and does not permit further calls ... stack trace omitted ... ? ? ? ?at io.reflectoring.resilience4j.circuitbreaker.Examples.main(Examples.java:231)

通常我們會配置一個具有故障率和慢速調用率閾值的斷路器:

CircuitBreakerConfig config = CircuitBreakerConfig ?.custom() ?.slidingWindowType(SlidingWindowType.COUNT_BASED) ?.slidingWindowSize(10) ?.failureRateThreshold(70.0f) ?.slowCallRateThreshold(70.0f) ?.slowCallDurationThreshold(Duration.ofSeconds(2)) ?.build();

基于時間的斷路器

假設我們希望斷路器在過去 10 秒內 70% 的請求失敗時斷開:

CircuitBreakerConfig config = CircuitBreakerConfig ?.custom() ?.slidingWindowType(SlidingWindowType.COUNT_BASED) ?.slidingWindowSize(10) ?.failureRateThreshold(70.0f) ?.slowCallRateThreshold(70.0f) ?.slowCallDurationThreshold(Duration.ofSeconds(2)) ?.build();

我們創(chuàng)建了?CircuitBreaker,將航班搜索調用表示為?Supplier<List<Flight>>?并使用?CircuitBreaker?對其進行裝飾,就像我們在上一節(jié)中所做的那樣。

以下是多次調用修飾操作后的示例輸出:

Start time: 18:51:01 552Searching for flights; current time = 18:51:01 582Flight search successful [Flight{flightNumber='XY 765', ... }] ... other lines omitted ... Searching for flights; current time = 18:51:01 631io.reflectoring.resilience4j.circuitbreaker.exceptions.FlightServiceException: Error occurred during flight search ... stack trace omitted ... Searching for flights; current time = 18:51:01 632io.reflectoring.resilience4j.circuitbreaker.exceptions.FlightServiceException: Error occurred during flight search ... stack trace omitted ... Searching for flights; current time = 18:51:01 633... other lines omitted ...io.github.resilience4j.circuitbreaker.CallNotPermittedException: CircuitBreaker 'flightSearchService' is OPEN and does not permit further calls ... other lines omitted ...

前 3 個請求成功,接下來的 7 個請求失敗。此時斷路器斷開,后續(xù)請求因拋出?CallNotPermittedException?而失敗。

現在,假設我們希望斷路器在過去 10 秒內 70% 的調用需要 1 秒或更長時間才能完成:

CircuitBreakerConfig config = CircuitBreakerConfig ?.custom() ?.slidingWindowType(SlidingWindowType.TIME_BASED) ?.minimumNumberOfCalls(10) ?.slidingWindowSize(10) ?.slowCallRateThreshold(70.0f) ?.slowCallDurationThreshold(Duration.ofSeconds(1)) ?.build();

示例輸出中的時間戳顯示請求始終需要 1 秒才能完成。在 10 個請求(minimumNumberOfCalls)之后,當斷路器確定 70% 的先前請求花費了 1 秒或更長時間時,它斷開電路:

Start time: 19:06:37 957Searching for flights; current time = 19:06:37 979Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... }] Searching for flights; current time = 19:06:39 066Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... }] Searching for flights; current time = 19:06:40 070Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... }] Searching for flights; current time = 19:06:41 070... other lines omitted ...io.github.resilience4j.circuitbreaker.CallNotPermittedException: CircuitBreaker 'flightSearchService' is OPEN and does not permit further calls ... stack trace omitted ...

通常我們會配置一個具有故障率和慢速調用率閾值的基于時間的斷路器:


指定斷開狀態(tài)下的等待時間

假設我們希望斷路器處于斷開狀態(tài)時等待 10 秒,然后轉換到半斷開狀態(tài)并讓一些請求傳遞到遠程服務:

CircuitBreakerConfig config = CircuitBreakerConfig ?.custom() ?.slidingWindowType(SlidingWindowType.TIME_BASED) ?.slidingWindowSize(10) ?.minimumNumberOfCalls(10) ?.failureRateThreshold(70.0f) ?.slowCallRateThreshold(70.0f) ?.slowCallDurationThreshold(Duration.ofSeconds(2)) ?.build();

示例輸出中的時間戳顯示斷路器最初轉換為斷開狀態(tài),在接下來的 10 秒內阻止一些調用,然后更改為半斷開狀態(tài)。后來,在半開狀態(tài)時一致的成功響應導致它再次切換到關閉狀態(tài):

Searching for flights; current time = 20:55:58 735Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... }] Searching for flights; current time = 20:55:59 812Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... }] Searching for flights; current time = 20:56:00 816... other lines omitted ... io.reflectoring.resilience4j.circuitbreaker.exceptions.FlightServiceException: Flight search failed ? ?at... stack trace omitted ...2020-12-13T20:56:03.850115+05:30: CircuitBreaker 'flightSearchService' changed state from CLOSED to OPEN2020-12-13T20:56:04.851700+05:30: CircuitBreaker 'flightSearchService' recorded a call which was not permitted.2020-12-13T20:56:05.852220+05:30: CircuitBreaker 'flightSearchService' recorded a call which was not permitted.2020-12-13T20:56:06.855338+05:30: CircuitBreaker 'flightSearchService' recorded a call which was not permitted.... other similar lines omitted ...2020-12-13T20:56:12.862362+05:30: CircuitBreaker 'flightSearchService' recorded a call which was not permitted.2020-12-13T20:56:13.865436+05:30: CircuitBreaker 'flightSearchService' changed state from OPEN to HALF_OPEN Searching for flights; current time = 20:56:13 865Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... }]... other similar lines omitted ...2020-12-13T20:56:16.877230+05:30: CircuitBreaker 'flightSearchService' changed state from HALF_OPEN to CLOSED [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... }] Searching for flights; current time = 20:56:17 879Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... }]... other similar lines omitted ...

指定回退方法

使用斷路器時的常見模式是指定在電路斷開時要調用的回退方法。回退方法可以為不允許的遠程調用提供一些默認值或行為

我們可以使用?Decorators?實用程序類進行設置。Decorators?是來自?resilience4j-all?模塊的構建器,具有?withCircuitBreaker()、withRetry()、withRateLimiter()?等方法,可幫助將多個 Resilience4j 裝飾器應用于?Supplier、Function?等。

當斷路器斷開并拋出?CallNotPermittedException?時,我們將使用它的?withFallback()?方法從本地緩存返回航班搜索結果:

Supplier<List<Flight>> flightsSupplier = () -> service.searchFlights(request); Supplier<List<Flight>> decorated = Decorators ?.ofSupplier(flightsSupplier) ?.withCircuitBreaker(circuitBreaker) ?.withFallback(Arrays.asList(CallNotPermittedException.class), ? ? ? ? ? ? ? ?e -> this.getFlightSearchResultsFromCache(request)) ?.decorate();

以下示例輸出顯示了斷路器斷開后從緩存中返回的搜索結果:

Searching for flights; current time = 22:08:29 735Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... }] Searching for flights; current time = 22:08:29 854Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... }] Searching for flights; current time = 22:08:29 855Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... }] Searching for flights; current time = 22:08:29 8552020-12-13T22:08:29.856277+05:30: CircuitBreaker 'flightSearchService' recorded an error: 'io.reflectoring.resilience4j.circuitbreaker.exceptions.FlightServiceException: Error occurred during flight search'. Elapsed time: 0 ms Searching for flights; current time = 22:08:29 912... other lines omitted ...2020-12-13T22:08:29.926691+05:30: CircuitBreaker 'flightSearchService' changed state from CLOSED to OPEN Returning flight search results from cache [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... }] Returning flight search results from cache [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... }]... other lines omitted ...

減少 Stacktrace 中的信息

每當斷路器斷開時,它就會拋出?CallNotPermittedException:

io.github.resilience4j.circuitbreaker.CallNotPermittedException: CircuitBreaker 'flightSearchService' is OPEN and does not permit further calls ? ?at io.github.resilience4j.circuitbreaker.CallNotPermittedException.createCallNotPermittedException(CallNotPermittedException.java:48) ... other lines in stack trace omitted ... at io.reflectoring.resilience4j.circuitbreaker.Examples.timeBasedSlidingWindow_SlowCalls(Examples.java:169) ? ?at io.reflectoring.resilience4j.circuitbreaker.Examples.main(Examples.java:263)

除了第一行,堆棧跟蹤中的其他行沒有增加太多價值。如果 CallNotPermittedException 發(fā)生多次,這些堆棧跟蹤行將在我們的日志文件中重復。

我們可以通過將?writablestacktraceEnabled()?配置設置為?false?來減少堆棧跟蹤中生成的信息量:

CircuitBreakerConfig config = CircuitBreakerConfig ?.custom() ?.slidingWindowType(SlidingWindowType.COUNT_BASED) ?.slidingWindowSize(10) ?.failureRateThreshold(70.0f) ?.writablestacktraceEnabled(false) ?.build();

現在,當?CallNotPermittedException?發(fā)生時,堆棧跟蹤中只存在一行:

Searching for flights; current time = 20:29:24 476Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... ] Searching for flights; current time = 20:29:24 540Flight search successful [Flight{flightNumber='XY 765', flightDate='12/31/2020', from='NYC', to='LAX'}, ... ] ... other lines omitted ...io.github.resilience4j.circuitbreaker.CallNotPermittedException: CircuitBreaker 'flightSearchService' is OPEN and does not permit further callsio.github.resilience4j.circuitbreaker.CallNotPermittedException: CircuitBreaker 'flightSearchService' is OPEN and does not permit further calls ...

其他有用的方法

與?Retry?Retry 模塊類似,CircuitBreaker?也有像?ignoreExceptions()、recordExceptions()?等方法,讓我們可以指定?CircuitBreaker?在跟蹤調用結果時應該忽略和考慮哪些異常。

例如,我們可能不想忽略來自遠程飛行服務的?SeatsUnavailableException?- 在這種情況下,我們真的不想斷開電路。

與我們見過的其他 Resilience4j 模塊類似,CircuitBreaker?還提供了額外的方法,如?decorateCheckedSupplier()、decorateCompletionStage()、decorateRunnable()、decorateConsumer()?等,因此我們可以在?Supplier?之外的其他結構中提供我們的代碼。

斷路器事件

CircuitBreaker?有一個?EventPublisher?可以生成以下類型的事件:

  • CircuitBreakerOnSuccessEvent,

  • CircuitBreakerOnErrorEvent,

  • CircuitBreakerOnStateTransitionEvent,

  • CircuitBreakerOnResetEvent,

  • CircuitBreakerOnIgnoredErrorEvent,

  • CircuitBreakerOnCallNotPermittedEvent,

  • CircuitBreakerOnFailureRateExceededEvent?以及

  • CircuitBreakerOnSlowCallRateExceededEvent.

我們可以監(jiān)聽這些事件并記錄它們,例如:

circuitBreaker.getEventPublisher() ?.onCallNotPermitted(e -> System.out.println(e.toString()));circuitBreaker.getEventPublisher() ?.onError(e -> System.out.println(e.toString()));circuitBreaker.getEventPublisher() ?.onFailureRateExceeded(e -> System.out.println(e.toString()));circuitBreaker.getEventPublisher().onStateTransition(e -> System.out.println(e.toString()));

以下是示例的日志輸出:

2020-12-13T22:25:52.972943+05:30: CircuitBreaker 'flightSearchService' recorded an error: 'io.reflectoring.resilience4j.circuitbreaker.exceptions.FlightServiceException: Error occurred during flight search'. Elapsed time: 0 msSearching for flights; current time = 22:25:52 973... other lines omitted ...2020-12-13T22:25:52.974448+05:30: CircuitBreaker 'flightSearchService' exceeded failure rate threshold. Current failure rate: 70.02020-12-13T22:25:52.984300+05:30: CircuitBreaker 'flightSearchService' changed state from CLOSED to OPEN2020-12-13T22:25:52.985057+05:30: CircuitBreaker 'flightSearchService' recorded a call which was not permitted.... other lines omitted ...

CircuitBreaker指標

CircuitBreake?暴露了許多指標,這些是一些重要的條目:

  • 成功、失敗或忽略的調用總數 (resilience4j.circuitbreaker.calls)

  • 斷路器狀態(tài) (resilience4j.circuitbreaker.state)

  • 斷路器故障率?(resilience4j.circuitbreaker.failure.rate)

  • 未被允許的調用總數?(resilience4.circuitbreaker.not.permitted.calls)

  • 斷路器的緩慢調用?(resilience4j.circuitbreaker.slow.call.rate)

首先,我們像往常一樣創(chuàng)建?CircuitBreakerConfig、CircuitBreakerRegistry?和?CircuitBreaker。然后,我們創(chuàng)建一個?MeterRegistry?并將?CircuitBreakerRegistry?綁定到它:

MeterRegistry meterRegistry = new SimpleMeterRegistry(); TaggedCircuitBreakerMetrics.ofCircuitBreakerRegistry(registry) ?.bindTo(meterRegistry);

運行幾次斷路器修飾操作后,我們顯示捕獲的指標。這是一些示例輸出:

The number of slow failed calls which were slower than a certain threshold - resilience4j.circuitbreaker.slow.calls: 0.0The states of the circuit breaker - resilience4j.circuitbreaker.state: 0.0, state: metrics_onlyTotal number of not permitted calls - resilience4j.circuitbreakernot.permitted.calls: 0.0The slow call of the circuit breaker - resilience4j.circuitbreaker.slow.call.rate: -1.0The states of the circuit breaker - resilience4j.circuitbreaker.state: 0.0, state: half_openTotal number of successful calls - resilience4j.circuitbreaker.calls: 0.0, kind: successfulThe failure rate of the circuit breaker - resilience4j.circuitbreaker.failure.rate: -1.0

在實際應用中,我們會定期將數據導出到監(jiān)控系統并在儀表板上進行分析。

結論

在本文中,我們學習了如何使用 Resilience4j 的 Circuitbreaker 模塊在遠程服務返回錯誤時暫停向其發(fā)出請求。我們了解了為什么這很重要,還看到了一些有關如何配置它的實際示例。

您可以使用?[GitHub 上](
https://github.com/thombergs/code-examples/tree/master/resilience4j/circuitbreaker)的代碼來演示一個完整的應用程序。

本文譯自:[Implementing a Circuit Breaker with Resilience4j - Reflectoring](

https://reflectoring.io/circuitbreaker-with-resilience4j/)


Java 項目中使用 Resilience4j 框架實現隔斷機制/斷路器的評論 (共 條)

分享到微博請遵守國家法律
永清县| 庆元县| 宁化县| 苏尼特左旗| 布拖县| 武胜县| 沙洋县| 惠水县| 武宣县| 吉水县| 武陟县| 吴江市| 洛浦县| 翁源县| 珲春市| 兴山县| 微山县| 西青区| 桂平市| 宁化县| 新蔡县| 赤峰市| 丹巴县| 苗栗县| 酒泉市| 商丘市| 明光市| 蒙自县| 罗甸县| 太仆寺旗| 马公市| 邯郸县| 黄陵县| 临朐县| 浠水县| 南岸区| 桃源县| 多伦县| 德清县| 邳州市| 云安县|