配置框架重试断路器

Spring Framework 7 引入了原生重试支持,作为框架弹性特性的一部分。Spring Cloud CircuitBreaker 提供了一个使用 Spring Framework 的断路器实现重试模板RetryPolicy蜜蜂属。spring-doc.cadn.net.cn

与 Spring Framework 的无状态重试支持不同,该实现通过跟踪故障和实现断路器模式,增加了有状态的断路器功能(闭合、开启和半开状态)。该实现以 Spring Retry 的CircuitBreakerRetry策略,其中电路在一次失败执行后打开(所有重试耗尽),而不是计算单个重试次数。spring-doc.cadn.net.cn

首先

要使用Framework Retry断路器实现,请在您的项目中添加以下起始工具:spring-doc.cadn.net.cn

梅文
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-circuitbreaker-framework-retry</artifactId>
</dependency>
格拉德勒
implementation 'spring-cloud-starter-circuitbreaker-framework-retry'

默认配置

要为所有断路器提供默认配置,请创建定制器传递给 a 的豆子框架RetryCircuitBreakerFactory. 这configureDefault可以用来提供默认配置。spring-doc.cadn.net.cn

@Bean
public Customizer<FrameworkRetryCircuitBreakerFactory> defaultCustomizer() {
	return factory -> factory.configureDefault(id -> new FrameworkRetryConfigBuilder(id)
		.retryPolicy(RetryPolicy.withMaxRetries(3))
		.openTimeout(Duration.ofSeconds(20))
		.resetTimeout(Duration.ofSeconds(5))
		.build());
}

配置选项

FrameworkRetryConfigBuilder提供以下配置选项:spring-doc.cadn.net.cn

  • retryPolicy(RetryPolicy)- 春季框架RetryPolicy用于重试。这决定了重试次数和条件。spring-doc.cadn.net.cn

  • openTimeout(持续时间)- 电路保持开通时间,直到切换到半开状态。默认时间为20秒。spring-doc.cadn.net.cn

  • resetTimeout(持续时间)- 故障发生后等待的时间,然后重置断路器状态。如果在此超时内无故障,断路器会自动重置为闭合状态。默认为5秒。spring-doc.cadn.net.cn

特定断路器配置

类似于提供默认配置,你可以创建定制器传递给 a 的豆子框架RetryCircuitBreakerFactory配置特定的断路器。spring-doc.cadn.net.cn

@Bean
public Customizer<FrameworkRetryCircuitBreakerFactory> slowCustomizer() {
	return factory -> factory.configure(builder -> builder
		.retryPolicy(RetryPolicy.withMaxRetries(1))
		.openTimeout(Duration.ofSeconds(30))
		.resetTimeout(Duration.ofSeconds(10))
		.build(), "slow");
}

重试政策

Spring Framework 7 提供了若干内置重试策略,可与框架重试断路器配合使用:spring-doc.cadn.net.cn

你也可以用以下方式合并保单并且()或者()运营商:spring-doc.cadn.net.cn

@Bean
public Customizer<FrameworkRetryCircuitBreakerFactory> customRetryPolicy() {
	return factory -> factory.configureDefault(id -> new FrameworkRetryConfigBuilder(id)
		.retryPolicy(RetryPolicy.withMaxRetries(3)
			.and(RetryPolicy.withMaxDuration(Duration.ofSeconds(5)))
			.forExceptions(IOException.class, TimeoutException.class))
		.build());
}

断路器行为

Framework Retry 断路器的实现遵循 Spring Retry 断路器的模式:spring-doc.cadn.net.cn

  • 关闭状态:请求被允许通过并根据配置重试RetryPolicy. 当完全调用失败(所有重试用尽)时,电路立即打开。spring-doc.cadn.net.cn

  • 开放状态:请求立即失败,无需尝试重试即可获得备份响应。之后openTimeout电路就切换到半开路。spring-doc.cadn.net.cn

  • 半开状态:允许通过一次请求以测试服务是否恢复。如果成功,电路关闭。如果失败,电路重新打开。spring-doc.cadn.net.cn

  • 重置超时:如果在resetTimeout断路器会自动重置为闭合状态,即使之前是开的。spring-doc.cadn.net.cn

示例用法

以下是使用Framework Retry断路器的完整示例:spring-doc.cadn.net.cn

@Service
public class BookService {

	private final CircuitBreakerFactory circuitBreakerFactory;
	private final RestTemplate restTemplate;

	public BookService(CircuitBreakerFactory circuitBreakerFactory, RestTemplate restTemplate) {
		this.circuitBreakerFactory = circuitBreakerFactory;
		this.restTemplate = restTemplate;
	}

	public String getBookTitle(Long bookId) {
		CircuitBreaker circuitBreaker = circuitBreakerFactory.create("bookService");
		return circuitBreaker.run(
			() -> restTemplate.getForObject("/books/" + bookId, String.class),
			throwable -> "Fallback Book"
		);
	}
}

配置示例

@Configuration
public class CircuitBreakerConfiguration {

	@Bean
	public Customizer<FrameworkRetryCircuitBreakerFactory> defaultCustomizer() {
		return factory -> {
			// Default configuration for all circuit breakers
			factory.configureDefault(id -> new FrameworkRetryConfigBuilder(id)
				.retryPolicy(RetryPolicy.withMaxRetries(3)
					.withBackoff(Duration.ofMillis(100), 2.0))
				.openTimeout(Duration.ofSeconds(20))
				.resetTimeout(Duration.ofSeconds(5))
				.build());
		};
	}

	@Bean
	public Customizer<FrameworkRetryCircuitBreakerFactory> specificCustomizer() {
		return factory -> {
			// Specific configuration for "slow" circuit breaker
			factory.configure(builder -> builder
				.retryPolicy(RetryPolicy.withMaxRetries(1))
				.openTimeout(Duration.ofSeconds(30))
				.resetTimeout(Duration.ofSeconds(10))
				.build(), "slow");

			// Specific configuration for "critical" circuit breaker
			factory.configure(builder -> builder
				.retryPolicy(RetryPolicy.withMaxRetries(5))
				.openTimeout(Duration.ofMinutes(2))
				.resetTimeout(Duration.ofSeconds(15))
				.build(), "critical");
		};
	}
}

响应式支持

Framework Retry 断路器的实现不支持被动式应用。如果你需要被动式支持,请使用 Resilience4J 实现。spring-doc.cadn.net.cn