aop统计请求数量_Guava RateLimiter + AOP注解实现单机限流、统计QPS

本文介绍了如何在SpringBoot项目中结合Guava RateLimiter和AOP注解实现单机限流及统计请求频率。首先在pom.xml中引入相关依赖,接着创建自定义注解`LxRateLimit`用于标记需要限流的方法,并设置限流参数。然后创建AOP切面`LxRateLimitAspect`,在切点中定义限流逻辑,根据注解设置限流速率并检查是否能获取到令牌。如果超过限流速率,则返回错误提示,否则执行目标方法。
摘要由CSDN通过智能技术生成

1、基于springboot项目pom.xml添加如下依赖:

org.springframework.boot

spring-boot-starter-aop

com.google.guava

guava

18.0

org.springframework.data

spring-data-redis

2、创建自定义运行时注解:

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface LxRateLimit {

/**

*

* @return

*/

String value() default "";

/**

* 每秒向桶中放入令牌的数量 默认最大即不做限流

* @return

*/

double perSecond() default Double.MAX_VALUE;

/**

* 获取令牌的等待时间 默认0

* @return

*/

int timeOut() default 0;

/**

* 超时时间单位

* @return

*/

TimeUnit timeOutUnit() default TimeUnit.MILLISECONDS;

}

3、创建aop切面进行环绕通知:

@Aspect

@Component

public class LxRateLimitAspect {

private final static Logger logger = LoggerFactory.getLogger(LxRateLimitAspect.class);

private RateLimiter rateLimiter = RateLimiter.create(Double.MAX_VALUE);

/**

* 定义切点

* 1、通过扫包切入

* 2、带有指定注解切入

*/

// @Pointcut("execution(public * com.ycn.springcloud.*.*(..))")

@Pointcut("@annotation(com.ycn.springcloud.annotation.LxRateLimit)")

public void checkPointcut() { }

@ResponseBody

@Around(value = "checkPointcut()")

public Object aroundNotice(ProceedingJoinPoint pjp) throws Throwable {

logger.info("拦截到了{}方法...", pjp.getSignature().getName());

Signature signature = pjp.getSignature();

MethodSignature methodSignature = (MethodSignature)signature;

//获取目标方法

Method targetMethod = methodSignature.getMethod();

if (targetMethod.isAnnotationPresent(LxRateLimit.class)) {

//获取目标方法的@LxRateLimit注解

LxRateLimit lxRateLimit = targetMethod.getAnnotation(LxRateLimit.class);

rateLimiter.setRate(lxRateLimit.perSecond());

if (!rateLimiter.tryAcquire(lxRateLimit.timeOut(), lxRateLimit.timeOutUnit()))

return "服务器繁忙,请稍后再试!";

}

return pjp.proceed();

}

}

在ctroller中使用自定义注解

@RequestMapping("/testAnnotation")

@LxRateLimit(perSecond = 1.0, timeOut = 500)

public String testAnnotation() {

return "get token success";

}

当接口QPS大于1的时候就会返回 “服务器繁忙,请稍后再试!”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值