注解代码:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RateLimit {
    int limit() default 5;
    int timeout() default 1000;
}

使用注解的接口方法代码:

@RateLimit(limit = 5, timeout = 1000)
public String getUserInfo(String userId) {
    // do something
}

限流器的实现代码:

public class RateLimiter {
    private int limit;
    private int timeout;
    private Map<String, List<Long>> records;

    public RateLimiter(int limit, int timeout) {
        this.limit = limit;
        this.timeout = timeout;
        this.records = new HashMap<>();
    }

    public boolean allowAccess(String userId) {
        long now = System.currentTimeMillis();
        List<Long> userRecords = records.getOrDefault(userId, new ArrayList<>());
        userRecords.removeIf(time -> time < now - timeout);
        if (userRecords.size() < limit) {
            userRecords.add(now);
            records.put(userId, userRecords);
            return true;
        }
        return false;
    }
}

在接口方法中,我们使用 @RateLimit 注解来标记需要进行接口限流的方法,同时指定限流的参数。在 RateLimiter 类中,我们实现了接口限流器的逻辑,使用了一个 records 字典来存储每个用户的操作时间记录,然后在 allowAccess 方法中,判断当前用户的操作时间记录是否超过限流的限制,如果未超过,就记录当前操作时间,并返回 true,表示允许访问;否则,返回 false,表示不允许访问。最后,在接口方法中调用 allowAccess 方法来判断是否允许访问。


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

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