配置框架 Retry 断路器

Spring Framework 7 引入了原生的重试支持,作为框架弹性特性的一部分。Spring Cloud CircuitBreaker 提供了一个断路器实现,该实现使用 Spring Framework 的 RetryTemplateRetryPolicy API。

与 Spring Framework 的无状态重试支持不同,此实现通过跟踪故障并实现断路器模式(关闭、打开和半开状态)来添加有状态的断路器功能。该实现是按照 Spring Retry 的 CircuitBreakerRetryPolicy 建模的,其中断路器在单个执行失败后(所有重试耗尽)打开,而不是计算单个重试尝试。

启动器

要使用 Framework Retry 断路器实现,请将以下启动器添加到您的项目中

Maven
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-circuitbreaker-framework-retry</artifactId>
</dependency>
Gradle
implementation 'spring-cloud-starter-circuitbreaker-framework-retry'

默认配置

要为所有断路器提供默认配置,请创建一个 Customizer bean,该 bean 传入一个 FrameworkRetryCircuitBreakerFactoryconfigureDefault 方法可用于提供默认配置。

@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 提供以下配置选项

  • retryPolicy(RetryPolicy) - 用于重试的 Spring Framework RetryPolicy。这决定了重试的次数和条件。

  • openTimeout(Duration) - 断路器在转换为半开状态之前保持打开的时间。默认值为 20 秒。

  • resetTimeout(Duration) - 故障后等待的时间,然后重置断路器状态。如果在此超时时间内没有发生故障,断路器会自动重置为关闭状态。默认值为 5 秒。

特定断路器配置

与提供默认配置类似,您可以创建一个 Customizer bean,该 bean 传入一个 FrameworkRetryCircuitBreakerFactory 来配置特定的断路器。

@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 提供了几种内置的重试策略,可以与 Framework Retry 断路器一起使用

  • RetryPolicy.withMaxRetries(int) - 重试固定次数

  • RetryPolicy.withMaxDuration(Duration) - 重试直到达到最大持续时间

  • RetryPolicy.withBackoff(Duration, double) - 以指数退避方式重试

  • RetryPolicy.forExceptions(Class<?>…​) - 仅针对特定异常类型重试

您还可以使用 and()or() 运算符组合策略

@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 断路器模式

  • 关闭状态:请求被允许通过并根据配置的 RetryPolicy 进行重试。当一个完整的调用失败时(所有重试耗尽),断路器立即打开。

  • 打开状态:请求立即失败并返回回退响应,不尝试重试。在 openTimeout 期限后,断路器转换为半开状态。

  • 半开状态:允许单个请求通过以测试服务是否已恢复。如果成功,断路器关闭。如果失败,断路器重新打开。

  • 重置超时:如果在 resetTimeout 期限内没有发生故障,断路器会自动重置为关闭状态,即使它之前是打开的。

使用示例

以下是使用 Framework Retry 断路器的完整示例

@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 实现。

© . This site is unofficial and not affiliated with VMware.