定义注解 @RateLimiter
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RateLimiter
{
// 限流key
public String key() default Constants.RATE_LIMIT_KEY;
// 限流时间,单位秒
public int time() default 60;
// 限流次数
public int count() default 100;
// 限流类型
public LimitType limitType() default LimitType.DEFAULT;
}
public enum LimitType
{
/**
* 默认策略全局限流
*/
DEFAULT,
/**
* 根据请求者IP进行限流
*/
IP
}
一个作用在方法上的注解,有四个属性
key:存储在redis里用到的key
time:限流时间,相当于redis里的有效期
count:限流次数
limitType: 限流类型,点开枚举发现有默认和IP两种限流方式,这两种方式的实现只是存储在redis里的key不同
2. 切面
我们来看一看@RateLimiter这个注解的切面RateLimiterAspect.java
@Aspect
@Component
public class RateLimiterAspect
{
private static final Logger log = LoggerFactory.getLogger(RateLimiterAspect.class);