此版本仍在开发中,目前尚不被视为稳定版本。如需最新稳定版本,请使用 Spring-Cloud-CircuitBreaker 5.0.1spring-doc.cadn.net.cn

配置框架重试电路中断器

Spring框架7引入了内置重试支持,作为框架弹性功能的一部分。 Spring Cloud电路断路器提供了使用Spring框架的电路断路器实现。 RetryTemplateRetryPolicyAPIsspring-doc.cadn.net.cn

与 Spring Framework 的重试支持不同,此实现通过跟踪故障并实现电路断路器模式(关闭、打开和半打开状态)来添加无状态电路断路器功能。 此实现以 CircuitBreakerRetryPolicy 为模型,电路在单个执行失败后打开(所有重试尝试用完),而不是计算单独的重试尝试。spring-doc.cadn.net.cn

Starters

要使用框架重试电路断路器实现,请向项目添加以下Starters。spring-doc.cadn.net.cn

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,将其传入一个FrameworkRetryCircuitBreakerFactory。可以使用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) - 使用Spring框架来确定重试次数和条件。这决定了应该发生多少次重试以及在什么条件下进行重试。spring-doc.cadn.net.cn

  • openTimeout(Duration) - The time the circuit stays open before transitioning to half-open state. Default is 20 seconds.spring-doc.cadn.net.cn

  • resetTimeout(Duration) - 在失败后等待的时间,在此超时内如果没有发生失败,断路器将自动重置为打开状态。默认是5秒。spring-doc.cadn.net.cn

特定的熔断器配置

与提供默认配置类似,您还可以创建一个 Customizer bean,传入一个 FrameworkRetryCircuitBreakerFactory 来配置特定的断路器。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 框架 7 提供了几个内置的重试策略,可以与框架重试电路断路器一起使用:spring-doc.cadn.net.cn

您也可以使用 and()or() 运算符组合策略: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());
}

Circuit Breaker Behavior

框架重试电路断路器实现遵循Spring重试电路断路器模式:spring-doc.cadn.net.cn

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

  • 半开 : 接受请求。如果成功,状态机切换到关闭;如果失败,则切换到打开状态,重新开始计时。spring-doc.cadn.net.cn

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

  • 重置超时:如果在 resetTimeout 期间没有发生任何故障,电路断路器会自动重置为关闭状态,即使它之前处于打开状态。spring-doc.cadn.net.cn

示例用法

下面是使用框架重试电路断路器的完整示例: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");
		};
	}
}

响应式支持

该框架重试电路断路器实现不支持响应式应用程序。 如果需要响应式支持,请改用 Resilience4J 实现。spring-doc.cadn.net.cn