Java 注解限流实现方案:控制用户请求频率

本文将介绍使用 Java 注解实现限流功能的完整方案,通过注解传入用户 ID 和每秒最大请求次数,限制用户请求频率,防止系统过载。

1. 注解定义

首先,定义一个名为 @RateLimit 的注解,用于标记需要限流的方法,并接收 userIdmaxRequestsPerSecond 两个参数。

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RateLimit {
    int userId();
    int maxRequestsPerSecond();
}

2. 限流逻辑实现

接下来,创建一个 RateLimiter 类,负责执行限流逻辑。该类维护一个 requestCountPerUser 的计数器,用于记录每个用户的请求次数。allowRequest 方法根据传入的 userIdmaxRequestsPerSecond 判断是否允许该用户的请求。

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 注解,并传入 userIdmaxRequestsPerSecond 参数。在方法内部,调用 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. 总结

通过使用注解和计数器来实现限流,可以避免在每个方法内部都需要手动编写限流逻辑的重复工作,并提高代码的可读性和可维护性。该方案简单易懂,易于扩展和维护,适用于各种需要控制用户请求频率的场景。

Java 注解限流实现方案:控制用户请求频率

原文地址: https://www.cveoy.top/t/topic/lVrT 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录