编辑 | blame | 历史 | 原始文档

1. 简介

部分接口,也许不允许用户高频率访问,则需要用到限流。

2. 接口

public interface RateLimiter {

    /**
     * 获取流量通行许可
     * @param fullMethod 方法全名 group.method
     * @param httpMethod 方法注解
     * @param personId 人的ID,管理员 或 用户
     * @param ip 外网IP
     * @return true 代表允许流量通过
     */
    public boolean acquire(String fullMethod, HttpMethod httpMethod, Long personId, String ip);

}

3. 默认实现

support包中默认提供 RateLimiterNone、RateLimiterRedisCount、RateLimiterRedisSlidingWindow 三种限流算法。分别是不限流、计数器、滑动窗口。**推荐使用滑动窗口。**

4. 使用方法

@HttpMethod(description = "提交订单", rate = 1, rateWindow = 30, rateLimit = RateLimitType.USER_ID)
public String takeOrder(
        @NotNull @HttpParam(name = "orderRequest", type = HttpParamType.COMMON, description = "订单请求实例") OrderRequestDTO orderRequest,
        @NotNull @HttpParam(name = "channel", type = HttpParamType.COMMON, description = "订单提交渠道") String channel,
        @NotNull @HttpParam(name = "userId", type = HttpParamType.USER_ID, description = "userId") Long userId) throws ServiceException;

详细看这行注解,指定好 rate、rateWindow、rateLimit三个字段即可限流。

@HttpMethod(description = "提交订单", rate = 1, rateWindow = 30, rateLimit = RateLimitType.USER_ID)

上面这行的意思是 单个用户,每30s内,可以提交1次订单。

字段 默认值 解释
rate 1 限流频率,在rateWindow秒内,可以执行多少次
rateWindow 60 默认窗口宽度
rateLimit RateLimitType.NONE 限流类型,默认不限流,枚举意思,请参考下面表格
public enum RateLimitType {
    USER_ID,
    IP,
    ALL,
    NONE;
}
枚举 解释
NONE 不限流
USER_ID 对单个用户(或管理员)限流,仅登录接口
IP 对IP限流
ALL 不区分身份,对所有请求限流

5. 实现自己的限流算法

@Primary
@Component
public class RateLimiterCustom implements RateLimiter {
    @Override
    public boolean acquire(String fullMethod, HttpMethod httpMethod, Long personId, String ip) {
        return true;
    }
}