controlle层:
@GetMapping("/limit")
public String limit() {
return "hello";
}
切面层:
@Aspect
@RestController
@Slf4j
public class LimitAspect {
private static final double DEFAULT_COUNT = 0.5;
private Cache<String, RateLimiter> cache = CacheBuilder.newBuilder().expireAfterAccess(10, TimeUnit.SECONDS).build();
@Around(value = "execution(* com.boot.mpdemo.controller..*.*(..))")
public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Signature signature = proceedingJoinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
String name = methodSignature.getMethod().getName();
RateLimiter rateLimiter = cache.get(name, () -> RateLimiter.create(DEFAULT_COUNT));
if (!rateLimiter.tryAcquire()) {
log.warn("请求过多");
throw new RuntimeException();
}
return proceedingJoinPoint.proceed();
}
}