Java中单纯用@RateLimiter(qps = 100)注解无法实现限流降级,因其仅为元数据,需结合AOP或Spring拦截机制织入逻辑,并依赖Resilience4j等组件提供实际限流能力。

Java中单纯用 @RateLimiter(qps = 100) 这样的自定义注解**无法直接实现限流降级**,因为注解本身只是元数据,不包含执行逻辑。要让这个注解生效,必须配合**AOP(面向切面编程)或 Spring 的拦截机制**,在方法调用前动态织入限流与降级逻辑。
1. 定义限流注解
先声明一个运行时保留的注解,用于标记需要限流的方法:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RateLimiter {
int qps() default 100;
String fallbackMethod() default "";
}
2. 选择并集成限流组件
注解只是“开关”,真正干活的是底层限流器。常用方案有:
-
Resilience4j:轻量、函数式、原生支持注解(
@RateLimiter),推荐搭配 Spring Boot 使用; -
Alibaba Sentinel:功能全面,支持QPS/线程数/熔断等,需配合
@SentinelResource和规则配置; - Guava RateLimiter:简单本地限流,但需手动编码 + AOP,不支持分布式和注解自动绑定;
- Spring Cloud Gateway 内置限流:适用于网关层,不适用于业务接口方法级。
3. 基于 Resilience4j 实现注解驱动限流(推荐)
添加依赖:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
<dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-spring-boot2</artifactId> </dependency>
配置 application.yml:
resilience4j.ratelimiter:
instances:
default:
limit-for-period: 100
limit-refresh-period: 1s
timeout-duration: 0s
在 Controller 方法上使用(注意:Resilience4j 自带 @RateLimiter,无需自己写 AOP):
@GetMapping("/api/data")
@RateLimiter(name = "default", fallbackMethod = "fallback")
public String getData() {
return "success";
}
private String fallback(Throwable t) {
return "rate limited";
}
⚠️ 注意:Resilience4j 的 @RateLimiter 是它自己的注解(io.github.resilience4j.ratelimiter.annotation.RateLimiter),不是你自定义的那个。若坚持用自定义 @RateLimiter,就必须手写 @Aspect 切面解析该注解,并调用 Resilience4j 的 RateLimiterRegistry 执行限流。
4. 手写 AOP 绑定自定义注解(进阶)
若必须用 @RateLimiter(qps = 100) 这种形式,需编写切面:
- 注入
RateLimiterRegistry(Resilience4j 提供); - 在
@Around中解析@RateLimiter的qps和fallbackMethod; - 动态创建或获取对应 QPS 的限流器实例;
- 调用
rateLimiter.executeCheckedSupplier()包裹业务逻辑; - 捕获
RequestNotPermitted异常,反射调用 fallback 方法(需保证签名兼容)。
这类实现较重,适合统一治理场景,日常开发建议直接用 Resilience4j 或 Sentinel 的标准注解。

















