### 1. 简介 > 部分接口,也许不允许用户高频率访问,则需要用到限流。 ### 2. 接口 ```java 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. 使用方法 ```java @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三个字段即可限流。 ```java @HttpMethod(description = "提交订单", rate = 1, rateWindow = 30, rateLimit = RateLimitType.USER_ID) ``` 上面这行的意思是 单个用户,每30s内,可以提交1次订单。 | 字段 | 默认值 | 解释 | | ---------- | ------------------ | ---------------------------------------------- | | rate | 1 | 限流频率,在rateWindow秒内,可以执行多少次 | | rateWindow | 60 | 默认窗口宽度 | | rateLimit | RateLimitType.NONE | 限流类型,默认不限流,枚举意思,请参考下面表格 | ```java public enum RateLimitType { USER_ID, IP, ALL, NONE; } ``` | 枚举 | 解释 | | ------- | -------------------------------------- | | NONE | 不限流 | | USER_ID | 对单个用户(或管理员)限流,仅登录接口 | | IP | 对IP限流 | | ALL | 不区分身份,对所有请求限流 | ### 5. 实现自己的限流算法 ```java @Primary @Component public class RateLimiterCustom implements RateLimiter { @Override public boolean acquire(String fullMethod, HttpMethod httpMethod, Long personId, String ip) { return true; } } ```