1. 使用文档

Spring Cloud CircuitBreaker 项目包含了 Resilience4J 和 Spring Retry 的实现。 Spring Cloud CircuitBreaker 实现的 API 已在 Spring Cloud Commons 上线。使用文档 这些API可在Spring Cloud Commons文档中找到。spring-doc.cadn.net.cn

1.1. 配置Resilience4J断路器

1.1.1. 起始角色

Resilience4J 实现有两个起始程序,一个用于被动应用,一个用于非响应式应用。spring-doc.cadn.net.cn

  • org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j- 非响应式应用spring-doc.cadn.net.cn

  • org.springframework.cloud:Spring-Cloud-starter-Circuitbreaker-Reactor-Resilience4j- 响应式应用spring-doc.cadn.net.cn

1.1.2. 自动配置

你可以通过设置禁用 Resilience4J 的自动配置spring.cloud.circuitbreaker.resilience4j.enabledfalse.spring-doc.cadn.net.cn

1.1.3. 默认配置

为了为所有断路器提供默认配置,请创建一个自定义传递给 a 的豆子韧性4JCircuitBreakerFactory。ReactiveResilience4JCircuitBreakerFactory. 这configureDefault可以用来提供默认配置。spring-doc.cadn.net.cn

@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)
            .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
            .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build()).build());
}

1.1.4. 特定断路器配置

类似于提供默认配置,你可以创建自定义豆子,这是传递给韧性4JCircuitBreakerFactory。ReactiveResilience4JCircuitBreakerFactory.spring-doc.cadn.net.cn

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

除了配置已创建的断路器外,你还可以在断路器创建后、返回给呼叫者之前自定义该断路器。 为此你可以使用addCircuitBreakerCustomizer方法。 这对于向Resilience4J断路器添加事件处理程序非常有用。spring-doc.cadn.net.cn

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> slowCustomizer() {
    return factory -> factory.addCircuitBreakerCustomizer(circuitBreaker -> circuitBreaker.getEventPublisher()
    .onError(normalFluxErrorConsumer).onSuccess(normalFluxSuccessConsumer), "normalflux");
}
响应式示例
@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> slowCustomizer() {
    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.1.5. 断路器属性配置

你可以配置断路器时间限制器在你的应用配置属性文件中。 属性配置的优先级高于 Java定制器配置。spring-doc.cadn.net.cn

resilience4j.circuitbreaker:
 instances:
     backendA:
         registerHealthIndicator: true
         slidingWindowSize: 100
     backendB:
         registerHealthIndicator: true
         slidingWindowSize: 10
         permittedNumberOfCallsInHalfOpenState: 3
         slidingWindowType: TIME_BASED
         recordFailurePredicate: io.github.robwin.exception.RecordFailurePredicate

resilience4j.timelimiter:
 instances:
     backendA:
         timeoutDuration: 2s
         cancelRunningFuture: true
     backendB:
         timeoutDuration: 1s
         cancelRunningFuture: false

有关 Resilience4j 属性配置的更多信息,请参见 Resilience4J Spring Boot 2 配置spring-doc.cadn.net.cn

1.1.6. 隔舱结构支撑

如果resilience4j-bulkhead在类路径上,Spring Cloud CircuitBreaker 会用 Resilience4j Bulkhead 包裹所有方法。 你可以通过设置禁用Resilience4j隔板spring.cloud.circuitbreaker.bulkhead.resilience4j.enabledfalse.spring-doc.cadn.net.cn

Spring Cloud CircuitBreaker Resilience4j 提供了两种隔板模式实现:spring-doc.cadn.net.cn

默认情况下,Spring Cloud CircuitBreaker Resilience4j 使用固定线程池块头.关于实施的更多信息 隔板模式的部分见韧性4j隔板spring-doc.cadn.net.cn

Customizer<Resilience4jBulkheadProvider>可以用来提供默认值舱 壁ThreadPoolBulkhead配置。spring-doc.cadn.net.cn

@Bean
public Customizer<Resilience4jBulkheadProvider> defaultBulkheadCustomizer() {
    return provider -> provider.configureDefault(id -> new Resilience4jBulkheadConfigurationBuilder()
        .bulkheadConfig(BulkheadConfig.custom().maxConcurrentCalls(4).build())
        .threadPoolBulkheadConfig(ThreadPoolBulkheadConfig.custom().coreThreadPoolSize(1).maxThreadPoolSize(1).build())
        .build()
);
}

1.1.7. 特定隔板配置

类似于证明默认的“Bulkhead”或“ThreadPoolBulkhead”配置,你可以创建自定义听听这个 经过aResilience4jBulkheadProvider.spring-doc.cadn.net.cn

@Bean
public Customizer<Resilience4jBulkheadProvider> slowBulkheadProviderCustomizer() {
    return provider -> provider.configure(builder -> builder
        .bulkheadConfig(BulkheadConfig.custom().maxConcurrentCalls(1).build())
        .threadPoolBulkheadConfig(ThreadPoolBulkheadConfig.ofDefaults()), "slowBulkhead");
}

除了配置已创建的隔板外,你还可以在它们之后自定义隔板和线程池隔板 已经创建,但还没被返回给来电者。为此你可以使用addBulkheadCustomizeraddThreadPoolBulkheadCustomizer方法。spring-doc.cadn.net.cn

隔板示例
@Bean
public Customizer<Resilience4jBulkheadProvider> customizer() {
    return provider -> provider.addBulkheadCustomizer(bulkhead -> bulkhead.getEventPublisher()
        .onCallRejected(slowRejectedConsumer)
        .onCallFinished(slowFinishedConsumer), "slowBulkhead");
}
线程池隔板示例
@Bean
public Customizer<Resilience4jBulkheadProvider> slowThreadPoolBulkheadCustomizer() {
    return provider -> provider.addThreadPoolBulkheadCustomizer(threadPoolBulkhead -> threadPoolBulkhead.getEventPublisher()
        .onCallRejected(slowThreadPoolRejectedConsumer)
        .onCallFinished(slowThreadPoolFinishedConsumer), "slowThreadPoolBulkhead");
}

1.1.8. 舱面属性配置

你可以在应用的配置属性文件中配置 ThreadPoolBulkhead 和 SemaphoreBulkhead 实例。属性配置的优先级高于 Java定制器配置。spring-doc.cadn.net.cn

resilience4j.thread-pool-bulkhead:
    instances:
        backendA:
            maxThreadPoolSize: 1
            coreThreadPoolSize: 1
resilience4j.bulkhead:
    instances:
        backendB:
            maxConcurrentCalls: 10

有关Resilience4j属性配置的更多信息,请参见Resilience4JSpring靴2配置spring-doc.cadn.net.cn

1.1.9. 收集指标

Spring Cloud Circuit Breaker Resilience4j 包含自动配置,可以设置只要正确的指标收集 依赖关系存在于类路径上。要实现度量收集,你必须包含org.springframework.boot:spring-boot-starter-actuatorio.GitHub.resilience4j:resilience4j-micrometer.关于这些指标的更多信息 当这些依赖存在时,请参见Resilience4j文档spring-doc.cadn.net.cn

你不必包含微米-核心直接在被引入的过程中Spring-启动-执行器

1.2. 配置Spring重试断路器

Spring Retry 为 Spring 应用提供声明式重试支持。 项目的一部分包括实现断路器功能的能力。 Spring Retry 通过其CircuitBreakerRetry策略以及一次有状态的重审。 所有使用春季重试创建的断路器都将通过CircuitBreakerRetry策略以及一个默认重试状态. 这两个类别都可以配置为SpringRetryConfigBuilder.spring-doc.cadn.net.cn

1.2.1. 默认配置

为了为所有断路器提供默认配置,请创建一个自定义传递给 a 的豆子春季再试断路器工厂. 这configureDefault可以用来提供默认配置。spring-doc.cadn.net.cn

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

1.2.2. 特定断路器配置

类似于提供默认配置,你可以创建自定义豆子,这是传递给春季再试断路器工厂.spring-doc.cadn.net.cn

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

除了配置已创建的断路器外,你还可以在断路器创建后、返回给呼叫者之前自定义该断路器。 为此你可以使用addRetryTemplateCustomizers方法。 这对于向重试模板.spring-doc.cadn.net.cn

@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) {

        }
    }));
}