Spring Framework 7.0 引入了内置的容错(Resilience)功能,通过@Retryable
和@ConcurrencyLimit
注解,开发者无需再单独引入 spring-retry 模块即可实现重试和并发控制能力。
概述
随着现代分布式应用程序复杂性的不断增加,系统的健壮性和可靠性成为了开发者面临的重要挑战。网络波动、外部服务暂时不可用、数据库连接超时等问题在生产环境中屡见不鲜。为了应对这些挑战,开发者通常需要实现重试机制(Retry Mechanism)、并发控制(Concurrency Control)、熔断降级(Circuit Breaker)等容错设计模式(Resilience Design Patterns)来提高系统的容错能力。 笔者在开发 AI 应用时,在研究国内某厂商的 AI SDK 源码时发现,其重试和超时处理竟然还在使用原始的 for-while 循环实现,代码冗长且容易出错。相比之下,Spring Framework 7.0 的内置容错功能提供了真正现代化的解决方案,通过声明式注解配置即可实现复杂的重试策略,无需手写繁琐的循环逻辑,代码简洁优雅且功能强大。 在 Spring Framework 7.0.0-M6 版本中,官方正式引入了org.springframework.core.retry
包,将原本属于独立项目 “spring-retry” 的功能集成到了核心框架中。这一重要变化意味着从 Spring Framework 7.0 开始,开发者可以直接使用框架内置的容错功能来构建更加健壮的应用程序,无需额外引入依赖就能轻松应对各种故障场景。
主要新增的注解包括:
@Retryable
:方法重试功能(Method Retry)@ConcurrencyLimit
:并发限制功能(Concurrency Throttling)
@Retryable 重试功能
基本使用
@Retryable
注解可以应用在方法级别或类级别,为方法调用提供重试能力:
- 对任何异常都会重试
- 最多重试 3 次(initial failure + 3 retries)
- 重试间隔为 1 秒(固定延迟策略)
自定义重试策略
指定重试的异常类型
只对特定异常类型进行重试,提高重试的精准性:高级重试策略配置
配置更复杂的重试策略,包括指数退避算法(Exponential Backoff):delay * multiplier^attempt + jitter
,有效避免了重试风暴(Retry Storm)问题。
响应式编程支持
对于返回响应式类型(Reactive Types)的方法,@Retryable
会自动装饰 Project Reactor 的重试管道:
@ConcurrencyLimit 并发控制
基本使用
@ConcurrencyLimit
注解用于实现并发限流(Concurrency Throttling),限制方法的并发访问数量: