Spring Cloud Circuit Breaker熔断器-Resilience4J

1.0.4.RELEASE

1. 配置Resilience4J熔断器

1.1. 开始

Resilience4J有两个实现,一个用户响应式服务,另一个用于非响应式服务。

  • org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j 非响应式
  • org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j 响应式

1.2. 自动配置

要禁止Resilience4J的自动配置,设置spring.cloud.circuitbreaker.resilience4j.enabled = false。

1.3. 默认配置

要提供默认配置,只需创建一个自定义bean,返回Resilience4JCircuitBreakerFactoryReactiveResilience4JCircuitBreakerFactory即可。例如:

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() {
    return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
            .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build())
            .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
            .build());
}

响应式:

@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {
    return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
    		.timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build())
            .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
            .build());
}

1.4. 自定义配置

和默认配置类似,你可以创建一个自定义bean,返回Resilience4JCircuitBreakerFactoryReactiveResilience4JCircuitBreakerFactory即可:

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> slowCustomizer() {
    return factory -> factory.configure(builder -> builder.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
            .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(2)).build()), "slow");
}

在熔断器创建之后、方法返回之前,你可以通过addCircuitBreakerCustomizer添加一些事件处理方法:

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> slowCustomizer() {
    return factory -> factory.addCircuitBreakerCustomizer(circuitBreaker -> circuitBreaker.getEventPublisher()
    .onError(normalFluxErrorConsumer).onSuccess(normalFluxSuccessConsumer), "normalflux");
}

响应式:

@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> slowCusomtizer() {
    return factory -> {
        factory.configure(builder -> builder
        .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(2)).build())
        .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults()), "slow", "slowflux");
        factory.addCircuitBreakerCustomizer(circuitBreaker -> circuitBreaker.getEventPublisher()
            .onError(normalFluxErrorConsumer).onSuccess(normalFluxSuccessConsumer), "normalflux");
     };
}

1.5. 数据收集

只要添加了对应的依赖,熔断器会自动配置数据收集功能。对应的依赖有org.springframework.boot:spring-boot-starter-actuatorio.github.resilience4j:resilience4j-micrometer。更多数据信息请查看Resilience4j文档

2. 重试

Spring Retry给Spring应用提供声明式重试支持。该项目的一个子集也包括了实现熔断器的功能。 Spring Retry通过CircuitBreakerRetryPolicystateful retry提供一个熔断器的实现。所有Spring Retry的熔断器都会用到CircuitBreakerRetryPolicyDefaultRetryState。这两个类可以通过SpringRetryConfigBuilder配置。

2.1 默认配置

新建一个返回SpringRetryCircuitBreakerFactory的自定义bean,为所有的熔断器提供一个默认配置。下例中的configureDefault方法用来提供一个默认配置:

@Bean
public Customizer<SpringRetryCircuitBreakerFactory> defaultCustomizer() {
    return factory -> factory.configureDefault(id -> new SpringRetryConfigBuilder(id)
        .retryPolicy(new TimeoutRetryPolicy()).build());
}

2.2 详细配置

和默认配置类似,自定义一个返回SpringRetryCircuitBreakerFactory的bean:

@Bean
public Customizer<SpringRetryCircuitBreakerFactory> slowCustomizer() {
    return factory -> factory.configure(builder -> builder.retryPolicy(new SimpleRetryPolicy(1)).build(), "slow");
}

在熔断器创建之后、方法返回之前,你可以通过addRetryTemplateCustomizers添加一些事件处理方法:

@Bean
public Customizer<SpringRetryCircuitBreakerFactory> slowCustomizer() {
    return factory -> factory.addRetryTemplateCustomizers(retryTemplate -> retryTemplate.registerListener(new RetryListener() {

        @Override
        public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {
            return false;
        }

        @Override
        public <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {

        }

        @Override
        public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {

        }
    }));
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
Resilience4j 是一个用于构建弹性和容错性应用程序的轻量级库,其中包括熔断器(Circuit Breaker)功能。下面是 Resilience4j 熔断器的简单使用方法: 1. 添加 Maven 依赖:在项目的 pom.xml 文件中添加以下 Maven 依赖: ```xml <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-circuitbreaker</artifactId> <version>1.7.0</version> </dependency> ``` 2. 创建熔断器实例:使用 CircuitBreakerRegistry 创建一个熔断器实例。 ```java CircuitBreakerConfig config = CircuitBreakerConfig.custom() .failureRateThreshold(50) // 失败率阈值 .waitDurationInOpenState(Duration.ofMillis(1000)) // 熔断器打开后等待时间 .ringBufferSizeInHalfOpenState(2) // 半开状态下环形缓冲区大小 .ringBufferSizeInClosedState(2) // 关闭状态下环形缓冲区大小 .build(); CircuitBreakerRegistry registry = CircuitBreakerRegistry.of(config); CircuitBreaker circuitBreaker = registry.circuitBreaker("myCircuitBreaker"); ``` 3. 包装方法调用:使用熔断器包装需要进行容错处理的方法调用。 ```java CircuitBreaker.decorateCheckedSupplier(circuitBreaker, () -> { // 调用需要容错处理的方法 return myService.doSomething(); }); ``` 4. 处理熔断器状态:根据熔断器的状态进行相应处理。 ```java if (circuitBreaker.getState() == CircuitBreaker.State.OPEN) { // 熔断器打开时的处理逻辑 // 例如,返回一个默认值或者抛出一个自定义异常 } else { // 熔断器关闭或半开时的处理逻辑 // 例如,正常执行业务逻辑 } ``` 上述步骤中,你可以根据实际需求配置熔断器的参数,如失败率阈值、等待时间、环形缓冲区大小等。通过包装方法调用,当方法调用失败或达到一定条件时,熔断器将会打开,并执行相应的容错逻辑。你可以根据熔断器的状态来处理不同的情况。 注意:上述代码片段仅为示例,你需要根据自己的业务需求进行适当的调整和配置。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiegwei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值