Resilience4j系列 - 使用Resilience4j-circuitbreaker优雅实现服务降级

Maven集成

<!-- resilience4j -->
<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-circuitbreaker</artifactId>
    <version>1.7.0</version>
</dependency>
<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
    <version>1.7.0</version>
</dependency>
<!-- resilience spring boot integration with annotation requires spring aop -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

通过注解@CircuitBreaker实现

在配置文件里增加circuitbreaker配置信息:

resilience4j:
  circuitbreaker:
    configs:
      default:
        ringBufferSizeInClosedState: 1 # 熔断器关闭时的缓冲区大小
        ringBufferSizeInHalfOpenState: 1 # 熔断器半开时的缓冲区大小
        waitDurationInOpenState: 60000 # 熔断器从打开到半开需要的时间
        failureRateThreshold: 100 # 熔断器打开的失败阈值
        eventConsumerBufferSize: 5 # 事件缓冲区大小
        registerHealthIndicator: true # 健康监测
        automaticTransitionFromOpenToHalfOpenEnabled: true # 是否自动从打开到半开,不需要触发
    instances:
      backendA:
        baseConfig: default
        waitDurationInOpenState: 60000
        failureRateThreshold: 100

为需要实现服务降级的方法增加@CircuitBreaker注解

@Component
public class CircuitBreakCheckedService {

    @CircuitBreaker(name="backendA", fallbackMethod="fallback")
    public boolean checkedMethod(int someInput){
        //写一些会抛出异常的代码。
        return true;
    }

    //该方法的返回类型必须和注解的方法的返回类型一样。
    //该方法的名字必须和fallbackMethod的值一样。
    public boolean fallback(Throwable t){
        return false;
    }

    //如果抛出的异常时CallNotPermittedException。那么这个方法会被执行。
    public boolean fallback(CallNotPermittedException t){
        return false;
    }

    //fallback方法也可以带和注解方法一样的入参。
    public boolean fallback(int someInput, Throwable t){
        return false;
    }
}

通过编程方式实现

//1.创建circuitbreaker配置
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
    .failureRateThreshold(100) //窗口中触发断路器的失败率
    .waitDurationInOpenState(Duration.ofMillis(60000)) //从断开到半开的时间
    .ringBufferSizeInClosedState(3) //断路器未断开时,统计样本的窗口大小
    .permittedNumberOfCallsInHalfOpenState(2) //断路器半开时,允许通过的请求数量
    .automaticTransitionFromOpenToHalfOpenEnabled(true) //是否自动将断路器从断开切换到半开状态
    .build();

//2.创建CircuitBreaker对象
CircuitBreaker circuitBreaker = CircuitBreaker.of("myCircuitBreaker", circuitBreakerConfig);

//3.利用circuitBreaker包装需要进行服务熔断的代码
CheckedFunction0<Boolean> function = CircuitBreaker.decorateCheckedSupplier(
                circuitBreaker, () -> {
        //...
        //把需要控制的方法写在这里。
        //这是一些会抛出异常的代码。
        //...
});

//4.使用Try来执行该包装后的方法。
Try
    .of(f)
    .recover(throwable -> {
    //被控制的方法抛出任何异常之后的处理逻辑
    })
    .recover(CallNotPermittedException.class, e -> {
    //这是特别针对某个特定异常的处理逻辑,只有最精确匹配的异常处理逻辑会被执行
    })
    .get();

如果断路器断开了,那么每次运行时都会触发CallNotPermittedException。可以针对这个异常进行处理,比如提示“服务暂时不可用”之类的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CircuitBreakerEvent 是 Resilience4j 中的一个事件对象,它用于表示熔断器(Circuit Breaker)的状态变化事件。通过监听 CircuitBreakerEvent,你可以获取有关熔断器状态变化的信息,并根据需要采取相应的操作。 CircuitBreakerEvent 提供了以下主要方法和属性: 1. `getCircuitBreakerName()`:获取熔断器的名称。 2. `getEventType()`:获取事件类型,可以是 `SUCCESS`(成功)、`ERROR`(错误)、`IGNORED_ERROR`(被忽略的错误)和 `STATE_TRANSITION`(状态转换)。 3. `getElapsedDuration()`:获取事件发生时的持续时间。 4. `getThrowable()`:如果事件类型是 `ERROR` 或 `IGNORED_ERROR`,则获取相关的 Throwable 对象。 5. `getStateTransition()`:如果事件类型是 `STATE_TRANSITION`,则获取熔断器在状态转换时的状态信息,包括从哪个状态转换到哪个状态。 通过监听 CircuitBreakerEvent,你可以根据熔断器的状态变化来执行一些特定的操作,例如: - 在熔断器打开时,进行降级处理或返回默认值。 - 在熔断器关闭时,恢复正常的服务调用。 - 在熔断器半开时,进行试探性的请求以判断服务是否恢复正常。 你可以通过实现 CircuitBreakerEventConsumer 接口,并将其注册到 CircuitBreakerRegistry 中,以监听并处理熔断器事件。例如: ```java CircuitBreakerRegistry registry = CircuitBreakerRegistry.ofDefaults(); CircuitBreaker circuitBreaker = registry.circuitBreaker("myCircuitBreaker"); circuitBreaker.getEventPublisher() .onEvent(event -> { CircuitBreakerEvent.Type eventType = event.getEventType(); if (eventType == CircuitBreakerEvent.Type.ERROR) { // 处理错误事件 Throwable throwable = event.getThrowable(); // ... } else if (eventType == CircuitBreakerEvent.Type.STATE_TRANSITION) { // 处理状态转换事件 CircuitBreaker.StateTransition stateTransition = event.getStateTransition(); // ... } }); ``` 通过监听 CircuitBreakerEvent,你可以更加灵活地响应熔断器的状态变化,并根据具体的业务需求进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值