Java 注解限流实现方案:控制用户请求频率
Java 注解限流实现方案:控制用户请求频率
本文将介绍使用 Java 注解实现限流功能的完整方案,通过注解传入用户 ID 和每秒最大请求次数,限制用户请求频率,防止系统过载。
1. 注解定义
首先,定义一个名为 @RateLimit 的注解,用于标记需要限流的方法,并接收 userId 和 maxRequestsPerSecond 两个参数。
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RateLimit {
int userId();
int maxRequestsPerSecond();
}
2. 限流逻辑实现
接下来,创建一个 RateLimiter 类,负责执行限流逻辑。该类维护一个 requestCountPerUser 的计数器,用于记录每个用户的请求次数。allowRequest 方法根据传入的 userId 和 maxRequestsPerSecond 判断是否允许该用户的请求。
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class RateLimiter {
private final Map<Integer, Integer> requestCountPerUser = new ConcurrentHashMap<>();
public boolean allowRequest(int userId, int maxRequestsPerSecond) {
int currentRequests = requestCountPerUser.getOrDefault(userId, 0);
if (currentRequests >= maxRequestsPerSecond) {
return false;
}
requestCountPerUser.put(userId, currentRequests + 1);
return true;
}
}
3. 使用注解进行限流
最后,在需要限流的方法上使用 @RateLimit 注解,并传入 userId 和 maxRequestsPerSecond 参数。在方法内部,调用 rateLimiter.allowRequest 判断是否允许该用户的请求。如果返回 false,说明该用户的请求过于频繁,可以抛出一个异常来提示用户请求失败。否则,继续处理业务逻辑。
public class MyService {
private final RateLimiter rateLimiter = new RateLimiter();
@RateLimit(userId = 123, maxRequestsPerSecond = 10)
public void myMethod() {
if (!rateLimiter.allowRequest(123, 10)) {
throw new RuntimeException('请求过于频繁,请稍后再试');
}
// 处理业务逻辑
}
}
4. 代码解释
- @Retention(RetentionPolicy.RUNTIME):注解在运行时可见,以便在程序运行时读取和使用。
- @Target(ElementType.METHOD):注解只能应用于方法上。
- requestCountPerUser:使用
ConcurrentHashMap存储用户请求计数,确保线程安全。 - allowRequest:检查用户请求次数是否超过限流阈值,如果超过则返回
false,否则允许请求并更新计数器。 - @RateLimit 注解:指定用户 ID 和每秒最大请求次数。
- myMethod 方法:使用
@RateLimit注解进行限流,在请求频繁时抛出异常提示用户。
5. 总结
通过使用注解和计数器来实现限流,可以避免在每个方法内部都需要手动编写限流逻辑的重复工作,并提高代码的可读性和可维护性。该方案简单易懂,易于扩展和维护,适用于各种需要控制用户请求频率的场景。
原文地址: https://www.cveoy.top/t/topic/lVrT 著作权归作者所有。请勿转载和采集!