Vert.x Circuit Breaker使用及說明
Vert.x Circuit Breaker 是 Vert.x 框架中熔斷器模式的實(shí)現(xiàn),旨在通過追蹤故障次數(shù)、在失敗達(dá)到閾值時(shí)觸發(fā)熔斷,并提供可選的失敗回調(diào)機(jī)制,來保護(hù) Vert.x 的非阻塞和異步行為,提升系統(tǒng)的整體韌性。
以下從依賴配置、核心配置、使用方式、狀態(tài)管理、指標(biāo)監(jiān)控與擴(kuò)展使用六個(gè)方面,對(duì)其使用進(jìn)行詳解:
一、依賴配置
在使用 Vert.x Circuit Breaker 之前,需要在項(xiàng)目中添加相應(yīng)的依賴。以 Maven 和 Gradle 為例:
- Maven:在
pom.xml文件中添加以下依賴:
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-circuit-breaker</artifactId>
<version>最新版本號(hào)</version> <!-- 例如 4.4.0 -->
</dependency>
- Gradle:在
build.gradle文件中添加以下依賴:
compile 'io.vertx:vertx-circuit-breaker:最新版本號(hào)' <!-- 例如 4.4.0 -->
二、核心配置
創(chuàng)建 Vert.x Circuit Breaker 實(shí)例時(shí),可以通過 CircuitBreakerOptions 類進(jìn)行配置,主要參數(shù)包括:
- maxFailures:最大故障次數(shù),達(dá)到該次數(shù)后熔斷器將觸發(fā)熔斷。
- timeout:超時(shí)時(shí)間,如果操作在指定時(shí)間內(nèi)未完成,則視為失敗。
- fallbackOnFailure:是否在失敗時(shí)執(zhí)行回調(diào)邏輯。
- resetTimeout:熔斷器處于打開狀態(tài)(Open)后,經(jīng)過多長(zhǎng)時(shí)間嘗試進(jìn)入半開狀態(tài)(Half-Open)。
示例代碼:
CircuitBreaker breaker = CircuitBreaker.create("my-circuit-breaker", vertx,
new CircuitBreakerOptions()
.setMaxFailures(5) // 最大故障次數(shù)
.setTimeout(2000) // 超時(shí)時(shí)間(毫秒)
.setFallbackOnFailure(true) // 失敗時(shí)執(zhí)行回調(diào)
.setResetTimeout(10000) // 重置超時(shí)時(shí)間(毫秒)
);
三、使用方式
使用 Vert.x Circuit Breaker 執(zhí)行代碼時(shí),可以通過 execute 方法或 executeWithFallback 方法(如果配置了失敗回調(diào))來執(zhí)行受保護(hù)的操作。受保護(hù)的操作通常是一個(gè)返回 Future 的異步任務(wù)。
示例代碼:
breaker.execute(future -> {
// 模擬一個(gè)異步操作,例如 HTTP 請(qǐng)求
vertx.createHttpClient().request(HttpMethod.GET, 8080, "localhost", "/")
.compose(req -> req.send())
.compose(resp -> {
if (resp.statusCode() != 200) {
return Future.failedFuture("HTTP error");
} else {
return resp.body().map(Buffer::toString);
}
})
.onComplete(future); // 將結(jié)果或失敗傳遞給 future
}).setHandler(ar -> {
if (ar.succeeded()) {
System.out.println("Success: " + ar.result());
} else {
System.out.println("Failure: " + ar.cause().getMessage());
}
});
四、狀態(tài)管理
Vert.x Circuit Breaker 有三種狀態(tài):
- Closed(閉合):正常狀態(tài),允許操作執(zhí)行。
- Open(打開):當(dāng)故障次數(shù)達(dá)到閾值時(shí),熔斷器進(jìn)入打開狀態(tài),此時(shí)所有操作將立即失敗,不再嘗試執(zhí)行實(shí)際操作。
- Half-Open(半開):在打開狀態(tài)經(jīng)過
resetTimeout時(shí)間后,熔斷器進(jìn)入半開狀態(tài),允許部分操作執(zhí)行以測(cè)試服務(wù)是否恢復(fù)。如果操作成功,熔斷器將重置為閉合狀態(tài);如果操作失敗,熔斷器將重新進(jìn)入打開狀態(tài)。
可以通過 halfOpenHandler 方法注冊(cè)回調(diào),以在熔斷器進(jìn)入半開狀態(tài)時(shí)執(zhí)行特定邏輯。
五、指標(biāo)監(jiān)控
Vert.x Circuit Breaker 提供了指標(biāo)監(jiān)控功能,可以通過 Vert.x Web Handler 和事件總線(Event Bus)來收集熔斷器的狀態(tài)和指標(biāo)信息。
如果需要自定義通知地址,可以在創(chuàng)建熔斷器時(shí)進(jìn)行設(shè)置。
六、擴(kuò)展使用
- 與 Hystrix 結(jié)合使用:雖然 Vert.x Circuit Breaker 已經(jīng)提供了熔斷器模式的實(shí)現(xiàn),但也可以與 Hystrix 結(jié)合使用。Hystrix 提供了更豐富的功能,如線程池隔離、請(qǐng)求緩存等。在使用時(shí),需要將 Hystrix 添加到依賴中,并通過
HystrixCommand隔離受保護(hù)的調(diào)用。不過,由于 Hystrix 的命令執(zhí)行是阻塞的,因此需要結(jié)合executeBlocking方法或在 Worker Verticle 中調(diào)用。 - 與 Bulkhead 模式結(jié)合使用:Bulkhead 模式用于隔離服務(wù),防止資源耗盡。可以將每個(gè)服務(wù)調(diào)用包裝在一個(gè) Bulkhead 中,并在 Bulkhead 內(nèi)部使用 Circuit Breaker 來防止重復(fù)失敗嘗試和檢測(cè)服務(wù)恢復(fù)。
七、總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java使用this調(diào)用構(gòu)造函數(shù)的實(shí)現(xiàn)方法示例
這篇文章主要介紹了java使用this調(diào)用構(gòu)造函數(shù)的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了java面向?qū)ο蟪绦蛟O(shè)計(jì)中函數(shù)調(diào)用相關(guān)操作技巧,需要的朋友可以參考下2019-08-08
使用 Spring Boot 2.0 + WebFlux 實(shí)現(xiàn) RESTful API功能
什么是 Spring WebFlux, 它是一種異步的, 非阻塞的, 支持背壓(Back pressure)機(jī)制的Web 開發(fā)框架.下面通過本文給大家介紹使用 Spring Boot 2.0 + WebFlux 實(shí)現(xiàn) RESTful API功能,需要的朋友參考下吧2018-01-01
關(guān)于在使用Lombok時(shí)maven?install找不到符號(hào)問題的解決辦法
Maven環(huán)境下開發(fā)項(xiàng)目時(shí),尤其是涉及Lombok或其他依賴時(shí),IDE會(huì)在構(gòu)建和編譯過程中進(jìn)行注解處理,這篇文章主要介紹了關(guān)于在使用Lombok時(shí)maven?install找不到符號(hào)問題的解決辦法,需要的朋友可以參考下2025-10-10
工廠模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了工廠模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理的相關(guān)資料,需要的朋友可以參考下2017-08-08

