自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Resilience4j 深度揭秘:如何在 Spring Boot 中實(shí)現(xiàn)容錯(cuò)機(jī)制

開(kāi)發(fā) 架構(gòu)
本文將詳細(xì)介紹如何在 Spring Boot 項(xiàng)目中整合 Resilience4j,使你的應(yīng)用更具彈性和可靠性。

在現(xiàn)代微服務(wù)架構(gòu)中,服務(wù)之間的調(diào)用可能會(huì)因網(wǎng)絡(luò)延遲、服務(wù)故障等原因?qū)е率 榱私鉀Q這些問(wèn)題,Resilience4j 提供了一套可靠的容錯(cuò)機(jī)制。本文將詳細(xì)介紹如何在 Spring Boot 項(xiàng)目中整合 Resilience4j,使你的應(yīng)用更具彈性和可靠性。

一、Resilience4j 簡(jiǎn)介

什么是 Resilience4j

Resilience4j 是一個(gè)輕量級(jí)的容錯(cuò)庫(kù),專為 Java 8 及以上版本設(shè)計(jì)。它提供了一組強(qiáng)大的容錯(cuò)機(jī)制,包括斷路器(Circuit Breaker)、限流器(Rate Limiter)、艙壁隔離(Bulkhead)、重試(Retry)和時(shí)間限制器(Time Limiter)。

主要特性

  • 斷路器(Circuit Breaker):防止一個(gè)服務(wù)的故障蔓延到整個(gè)系統(tǒng)。
  • 限流器(Rate Limiter):限制特定時(shí)間內(nèi)的請(qǐng)求數(shù)量,防止過(guò)載。
  • 艙壁隔離(Bulkhead):隔離系統(tǒng)的不同部分,防止故障蔓延。
  • 重試(Retry):在請(qǐng)求失敗時(shí)自動(dòng)重試。
  • 時(shí)間限制器(Time Limiter):為請(qǐng)求設(shè)置時(shí)間限制,防止長(zhǎng)時(shí)間等待。

與 Hystrix 的對(duì)比

Resilience4j 旨在取代 Netflix Hystrix,提供更輕量和現(xiàn)代的解決方案。與 Hystrix 相比,Resilience4j 的主要優(yōu)勢(shì)在于它的依賴更少、性能更好,并且完全支持 Java 8 以上的函數(shù)式編程特性。

二、環(huán)境準(zhǔn)備

項(xiàng)目初始化

使用 Spring Initializr 創(chuàng)建一個(gè)新的 Spring Boot 項(xiàng)目,并添加以下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
    <version>2.1.0</version>
</dependency>

三、配置 Resilience4j

基本配置

在 application.yml 文件中添加基本配置:

resilience4j:
  circuitbreaker:
    configs:
      default:
        registerHealthIndicator: true
        slidingWindowSize: 100
        minimumNumberOfCalls: 10
        failureRateThreshold: 50
        waitDurationInOpenState: 10000
        permittedNumberOfCallsInHalfOpenState: 3

配置項(xiàng)解釋:

  • registerHealthIndicator: 是否注冊(cè) Circuit Breaker 的健康指標(biāo),默認(rèn)為 false。設(shè)置為 true 可以通過(guò) Actuator 端點(diǎn)監(jiān)控 Circuit Breaker 的狀態(tài)。
  • slidingWindowSize: 滑動(dòng)窗口的大小,用于計(jì)算失敗率。這里設(shè)置為 100,表示最近 100 個(gè)請(qǐng)求會(huì)被用來(lái)計(jì)算失敗率。
  • minimumNumberOfCalls: 在滑動(dòng)窗口內(nèi),至少需要有這么多請(qǐng)求才能開(kāi)始計(jì)算失敗率。這里設(shè)置為 10,表示至少需要 10 個(gè)請(qǐng)求后才會(huì)開(kāi)始計(jì)算失敗率。
  • failureRateThreshold: 失敗率閾值,當(dāng)失敗率超過(guò)這個(gè)值時(shí),Circuit Breaker 會(huì)進(jìn)入 OPEN 狀態(tài)。這里設(shè)置為 50,表示當(dāng)失敗率超過(guò) 50% 時(shí),Circuit Breaker 會(huì)打開(kāi)。
  • waitDurationInOpenState: Circuit Breaker 處于 OPEN 狀態(tài)時(shí)的等待時(shí)間,單位毫秒。這里設(shè)置為 10000,表示 Circuit Breaker 打開(kāi)后會(huì)等待 10 秒鐘。
  • permittedNumberOfCallsInHalfOpenState: Circuit Breaker 處于 HALF_OPEN 狀態(tài)時(shí)允許的請(qǐng)求數(shù)。這里設(shè)置為 3,表示 Circuit Breaker 半開(kāi)狀態(tài)時(shí)允許 3 個(gè)請(qǐng)求通過(guò)。

這段配置定義了一個(gè)基本的 Circuit Breaker 行為,可以保護(hù)系統(tǒng)免受頻繁失敗的服務(wù)的影響。通過(guò)調(diào)整這些參數(shù),可以根據(jù)具體應(yīng)用場(chǎng)景來(lái)優(yōu)化 Circuit Breaker 的行為。

注意: 這只是默認(rèn)配置,可以在創(chuàng)建 Circuit Breaker 實(shí)例時(shí)覆蓋這些配置。

配置 Circuit Breaker

配置斷路器:

resilience4j:
  circuitbreaker:
    instances:
      backendA:
        registerHealthIndicator: true
        slidingWindowSize: 100
        minimumNumberOfCalls: 10
        failureRateThreshold: 50
        waitDurationInOpenState: 10000
        permittedNumberOfCallsInHalfOpenState: 3

不同于之前的默認(rèn)配置,這里明確定義了一個(gè)名為 backendA 的 Circuit Breaker 實(shí)例,并為其指定了具體的配置參數(shù)。這意味著,這個(gè)配置只適用于名為 backendA 的 Circuit Breaker 實(shí)例,而其他 Circuit Breaker 實(shí)例將使用默認(rèn)配置(如果存在)。

配置 Rate Limiter

配置限流器:

resilience4j:
  ratelimiter:
    instances:
      backendA:
        limitForPeriod: 10
        limitRefreshPeriod: 5000

配置項(xiàng)解釋:

  • limitForPeriod: 在限流周期內(nèi)允許的最大請(qǐng)求數(shù)。這里設(shè)置為 10,表示在 5 秒內(nèi)最多允許 10 個(gè)請(qǐng)求。
  • limitRefreshPeriod: 限流周期的持續(xù)時(shí)間,單位毫秒。這里設(shè)置為 5000,表示限流周期為 5 秒。

配置含義:

這段配置定義了一個(gè)名為 backendA 的 RateLimiter 實(shí)例,用于控制對(duì) backendA 服務(wù)或資源的訪問(wèn)速率。

(1)限流策略: Resilience4j 使用令牌桶算法實(shí)現(xiàn)限流。RateLimiter 會(huì)維護(hù)一個(gè)固定數(shù)量的令牌,每個(gè)令牌代表一個(gè)請(qǐng)求的許可。當(dāng)請(qǐng)求到達(dá)時(shí),RateLimiter 會(huì)嘗試獲取令牌。如果獲取成功,則允許請(qǐng)求繼續(xù)執(zhí)行;如果獲取失敗,則請(qǐng)求會(huì)被拒絕或延遲處理。

(2) 限流配置: 本段配置中的 limitForPeriod 和 limitRefreshPeriod 參數(shù)定義了 RateLimiter 的限流策略。

  • limitForPeriod 規(guī)定了限流周期內(nèi)允許的最大請(qǐng)求數(shù)。例如,本例中設(shè)置為 10,表示在 5 秒內(nèi)最多允許 10 個(gè)請(qǐng)求。
  • limitRefreshPeriod 規(guī)定了限流周期的持續(xù)時(shí)間。例如,本例中設(shè)置為 5000,表示限流周期為 5 秒。這意味著,RateLimiter 會(huì)每隔 5 秒重新計(jì)算可用的令牌數(shù)。

限流效果:

假設(shè) limitForPeriod 為 10,limitRefreshPeriod 為 5000。那么,在任意的 5 秒內(nèi),系統(tǒng)最多只會(huì)處理 10 個(gè)請(qǐng)求。如果在 5 秒內(nèi)收到超過(guò) 10 個(gè)請(qǐng)求,則后面的請(qǐng)求會(huì)被拒絕或延遲處理。

配置 Bulkhead

配置艙壁隔離:

resilience4j:
  bulkhead:
    instances:
      backendA:
        maxConcurrentCalls: 25
        maxWaitDuration: 100

配置項(xiàng)解釋:

  • maxConcurrentCalls: 同時(shí)允許的最大并發(fā)調(diào)用數(shù)。這里設(shè)置為 25,表示 backendA 服務(wù)最多可以同時(shí)處理 25 個(gè)并發(fā)請(qǐng)求。
  • maxWaitDuration: 當(dāng)并發(fā)請(qǐng)求超過(guò) maxConcurrentCalls 限制時(shí),新請(qǐng)求最長(zhǎng)等待時(shí)間,單位毫秒。這里設(shè)置為 100,表示新請(qǐng)求最多等待 100 毫秒,如果仍然無(wú)法獲得處理資源,則會(huì)被拒絕或拋出異常。

配置含義:

這段配置定義了一個(gè)名為 backendA 的 Bulkhead 實(shí)例,用于控制對(duì) backendA 服務(wù)或資源的并發(fā)訪問(wèn)。

(1)隔離策略: Resilience4j 使用令牌桶算法實(shí)現(xiàn)對(duì)并發(fā)請(qǐng)求的隔離。Bulkhead 會(huì)維護(hù)一個(gè)固定數(shù)量的令牌,每個(gè)令牌代表一個(gè)處理資源的許可。當(dāng)請(qǐng)求到達(dá)時(shí),Bulkhead 會(huì)嘗試獲取令牌。如果獲取成功,則允許請(qǐng)求繼續(xù)執(zhí)行;如果獲取失敗,則請(qǐng)求會(huì)被拒絕或延遲處理。

(2)并發(fā)控制: 本段配置中的 maxConcurrentCalls 和 maxWaitDuration 參數(shù)定義了 Bulkhead 的并發(fā)控制策略。

  • maxConcurrentCalls 規(guī)定了同時(shí)允許的最大并發(fā)調(diào)用數(shù)。例如,本例中設(shè)置為 25,表示 backendA 服務(wù)最多可以同時(shí)處理 25 個(gè)并發(fā)請(qǐng)求。
  • maxWaitDuration 規(guī)定了當(dāng)并發(fā)請(qǐng)求超過(guò) maxConcurrentCalls 限制時(shí),新請(qǐng)求最長(zhǎng)等待時(shí)間。例如,本例中設(shè)置為 100,表示新請(qǐng)求最多等待 100 毫秒,如果仍然無(wú)法獲得處理資源,則會(huì)被拒絕或拋出異常。

限流效果:

假設(shè) maxConcurrentCalls 為 25,maxWaitDuration 為 100。那么,backendA 服務(wù)最多可以同時(shí)處理 25 個(gè)并發(fā)請(qǐng)求。如果在同一時(shí)刻收到超過(guò) 25 個(gè)請(qǐng)求,則后面的請(qǐng)求會(huì)嘗試等待 100 毫秒。如果在 100 毫秒內(nèi)仍然無(wú)法獲得處理資源,則會(huì)被拒絕或拋出異常。

配置 Retry

配置重試:

resilience4j:
  retry:
    instances:
      backendA:
        maxAttempts: 3
        waitDuration: 500

配置項(xiàng)解釋:

  • maxAttempts: 最大重試次數(shù),包括第一次調(diào)用在內(nèi)。這里設(shè)置為 3,表示當(dāng) backendA 服務(wù)調(diào)用失敗時(shí),最多會(huì)重試 2 次。
  • waitDuration: 重試間隔時(shí)間,單位毫秒。這里設(shè)置為 500,表示每次重試之前會(huì)等待 500 毫秒。

配置含義:

這段配置定義了一個(gè)名為 backendA 的 Retry 實(shí)例,用于對(duì) backendA 服務(wù)或資源的調(diào)用進(jìn)行重試操作。

重試策略: 當(dāng) backendA 服務(wù)調(diào)用失敗時(shí),Retry 實(shí)例會(huì)根據(jù)配置的重試策略進(jìn)行重試。

  • maxAttempts 規(guī)定了最大重試次數(shù)。例如,本例中設(shè)置為 3,表示當(dāng) backendA 服務(wù)調(diào)用失敗時(shí),最多會(huì)重試 2 次。
  • waitDuration 規(guī)定了重試間隔時(shí)間。例如,本例中設(shè)置為 500,表示每次重試之前會(huì)等待 500 毫秒。

重試流程:

  • 當(dāng)調(diào)用 backendA 服務(wù)發(fā)生異常時(shí),Retry 實(shí)例會(huì)進(jìn)行重試。
  • 重試之前,會(huì)等待 waitDuration 指定的時(shí)間。
  • 重試時(shí),會(huì)再次調(diào)用 backendA 服務(wù)。
  • 如果重試成功,則返回結(jié)果并結(jié)束。
  • 如果重試 maxAttempts 次后仍然失敗,則拋出異常。

通過(guò)這種方式,你可以為不同的服務(wù)或資源創(chuàng)建 Retry 實(shí)例,并根據(jù)它們的具體需求進(jìn)行配置,以提高服務(wù)的容錯(cuò)性和可用性。

配置 Time Limiter

配置時(shí)間限制器:

resilience4j:
  timelimiter:
    instances:
      backendA:
        timeoutDuration: 1000

配置項(xiàng)解釋:

timeoutDuration: 操作的超時(shí)時(shí)間,單位毫秒。這里設(shè)置為 1000,表示 backendA 服務(wù)的調(diào)用必須在 1 秒內(nèi)完成,否則會(huì)被視為超時(shí)。

配置含義:

這段配置定義了一個(gè)名為 backendA 的 TimeLimiter 實(shí)例,用于對(duì) backendA 服務(wù)或資源的調(diào)用進(jìn)行超時(shí)控制。

超時(shí)策略: 當(dāng) backendA 服務(wù)調(diào)用超過(guò) timeoutDuration 指定的時(shí)間時(shí),TimeLimiter 實(shí)例會(huì)認(rèn)為其超時(shí),并拋出 TimeoutException 異常。

超時(shí)效果:

假設(shè) timeoutDuration 為 1000。那么,當(dāng)調(diào)用 backendA 服務(wù)時(shí),如果超過(guò) 1 秒仍然沒(méi)有完成,則會(huì)被 TimeLimiter 實(shí)例視為超時(shí),并拋出 TimeoutException 異常。

四、、實(shí)現(xiàn)功能

實(shí)現(xiàn) Circuit Breaker

在 backendA 服務(wù)中使用斷路器:

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class BackendAService {

    private final RestTemplate restTemplate;

    public BackendAService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @CircuitBreaker(name = "backendA", fallbackMethod = "fallback")
    public String callExternalService() {
        return restTemplate.getForObject("http://external-service/api", String.class);
    }

    public String fallback(Exception e) {
        return "外部服務(wù)不可用";
    }
}

實(shí)現(xiàn) Rate Limiter

在 backendA 服務(wù)中使用限流器:

import io.github.resilience4j.ratelimiter.annotation.RateLimiter;
import org.springframework.stereotype.Service;

@Service
public class BackendAService {

    @RateLimiter(name = "backendA")
    public String callExternalService() {
        // 外部服務(wù)調(diào)用邏輯
        return "外部服務(wù)的響應(yīng)";
    }
}

實(shí)現(xiàn) Bulkhead

在 backendA 服務(wù)中使用艙壁隔離:

import io.github.resilience4j.bulkhead.annotation.Bulkhead;
import org.springframework.stereotype.Service;

@Service
public class BackendAService {

    @Bulkhead(name = "backendA")
    public String callExternalService() {
        // 外部服務(wù)調(diào)用邏輯
        return "外部服務(wù)的響應(yīng)";
    }
}

實(shí)現(xiàn) Retry

在 backendA 服務(wù)中使用重試:

import io.github.resilience4j.retry.annotation.Retry;
import org.springframework.stereotype.Service;

@Service
public class BackendAService {

    @Retry(name = "backendA")
    public String callExternalService() {
        // 外部服務(wù)調(diào)用邏輯
        return "外部服務(wù)的響應(yīng)";
    }

實(shí)現(xiàn) Time Limiter

在 backendA 服務(wù)中使用時(shí)間限制器:

import io.github.resilience4j.timelimiter.annotation.TimeLimiter;
import org.springframework.stereotype.Service;

import java.util.concurrent.CompletableFuture;

@Service
public class BackendAService {

    @TimeLimiter(name = "backendA")
    public CompletableFuture<String> callExternalService() {
        return CompletableFuture.supplyAsync(() -> {
            // 外部服務(wù)調(diào)用邏輯
            return "外部服務(wù)的響應(yīng)";
        });
    }
}

五、高級(jí)主題

自定義配置

如何進(jìn)行 Resilience4j 的自定義配置:

resilience4j:
  circuitbreaker:
    configs:
      custom:
        slidingWindowSize: 50
        minimumNumberOfCalls: 5

要使用自定義 Circuit Breaker 配置,您需要用 @CircuitBreaker(name = "custom") 注解你的方法。這將指定配置應(yīng)用于方法的 Circuit Breaker 實(shí)例。

性能優(yōu)化

優(yōu)化 Resilience4j 在生產(chǎn)環(huán)境中的性能:

  • 調(diào)整配置參數(shù)以平衡性能和穩(wěn)定性
  • 使用異步調(diào)用減少阻塞

問(wèn)題排查

常見(jiàn)問(wèn)題及其解決方案:

  • 問(wèn)題:Circuit Breaker 不工作

解決方案:檢查配置是否正確,確保服務(wù)調(diào)用符合觸發(fā)條件。

六、結(jié)語(yǔ)

Resilience4j 提供了一套強(qiáng)大的工具,使你的 Spring Boot 應(yīng)用更具彈性和可靠性。通過(guò)整合 Resilience4j,可以有效地應(yīng)對(duì)各種服務(wù)故障和過(guò)載情況。隨著 Resilience4j 的不斷發(fā)展,我們可以期待更多功能和優(yōu)化,使其在微服務(wù)架構(gòu)中發(fā)揮更大的作用。

責(zé)任編輯:趙寧寧 來(lái)源: 源話編程
相關(guān)推薦

2022-11-16 17:16:41

spring限流

2024-10-06 08:35:44

2023-06-27 07:31:59

微服務(wù)容錯(cuò)庫(kù)重試

2025-04-09 11:15:00

服務(wù)熔斷服務(wù)降分布式系統(tǒng)

2023-03-13 08:02:55

斷路器應(yīng)用API

2022-04-27 08:55:01

Spring外部化配置

2025-03-26 03:00:00

2025-03-11 08:20:58

2025-02-13 07:45:26

APISpringHTTP

2025-04-01 08:08:29

2025-05-14 04:00:00

2021-06-15 07:33:13

Java函數(shù)式編程

2022-03-07 07:33:24

Spring自定義機(jī)制線程池

2020-05-25 07:00:00

雙因素認(rèn)證身份認(rèn)證密碼

2022-02-15 08:22:28

Neo4jSpring數(shù)據(jù)庫(kù)

2025-02-25 08:00:00

SpringBootLua開(kāi)發(fā)

2021-12-11 13:29:36

SpringBoot 官方

2022-07-26 16:54:08

QuartzJava

2024-12-03 08:00:00

2017-05-09 10:34:21

Spring BootDubbo Activ擴(kuò)展
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)