背景
限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务。
开始打算使用Guava RateLimiter
来实现限流,但RateLimiter
是局限于单机中使用,然后打算使用Redis+Lua
脚本实现限流。
1 提供调用的接口
@Slf4j
@RestController
@RequestMapping("/rateLimter")
public class RateLimterController {
@PostMapping(value = "rateLimter")
@RateLimiter(key = "rateLimter", limit = "30", expire = "1", message = "请稍后再试")
public void rateLimter() {
log.info("通过测试")
}
}
2 自定义注解
/**
* @className RateLimiter
* @desc 限流注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RateLimiter {
/**
* 限流key
* @return
*/
String key() default "rate:limiter";
/**
* 单位时间限制通过请求数
* @return
*/
String limit() default "30";
/**
* 过期时间,单位秒
* @return
*/
String expire() default "1";
/**
* 限流提示语
* @return
*/
String message() default "请稍后再试";
}
3 设置切面
@Slf4j
@Aspect
@Component
@EnableAspectJAutoProxy