部分接口,也许不允许用户高频率访问,则需要用到限流。
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);
}
support包中默认提供 RateLimiterNone、RateLimiterRedisCount、RateLimiterRedisSlidingWindow 三种限流算法。分别是不限流、计数器、滑动窗口。**推荐使用滑动窗口。**
@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 | 不区分身份,对所有请求限流 |
@Primary
@Component
public class RateLimiterCustom implements RateLimiter {
@Override
public boolean acquire(String fullMethod, HttpMethod httpMethod, Long personId, String ip) {
return true;
}
}