一般的注解aop切面解决限流问题。

本文介绍了如何在Java中使用自定义注解和AOP技术实现RateLimiter接口,对方法调用进行限流,并在无法获取令牌时触发降级处理。适用于单机服务器环境下的流量控制。
摘要由CSDN通过智能技术生成

//自定义注解
@Target(value = ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyRateLimiter {
//向令牌桶放入令牌的速率
double rate();
//从令牌桶获取令牌的超时时间
long timeout() default 0;
}

//实现桶的限流和aop切面
@Aspect
@Component
public class MyRateLimiterAspect {
private RateLimiter rateLimiter = RateLimiter.create(2);
@Pointcut(“execution(public * com.test.limiter.controller..(…))”)
public void pointcut(){
}
/**

  • 核心切面方法 */
    @Around(“pointcut()”)
    public Object process(ProceedingJoinPoint proceedingJoinPoint) throws
    Throwable{

MethodSignature signature = (MethodSignature)
proceedingJoinPoint.getSignature();
//使用反射获取方法上是否存在@MyRateLimiter注解
MyRateLimiter myRateLimiter =
signature.getMethod().getDeclaredAnnotation(MyRateLimiter.class);
if(myRateLimiter == null){ //程序正常执行,执行目标方法
return proceedingJoinPoint.proceed();
}
//获取注解上的参数
//获取配置的速率
double rate = myRateLimiter.rate(); //获取客户端等待令牌的时间
long timeout = myRateLimiter.timeout();
//设置限流速率 rateLimiter.setRate(rate);
//判断客户端获取令牌是否超时
boolean tryAcquire = rateLimiter.tryAcquire(timeout,
TimeUnit.MILLISECONDS);
if(!tryAcquire){ //服务降级
fullback();
return null;
}
//获取到令牌,直接执行
return proceedingJoinPoint.proceed();
}
/**

  • 降级处理 */
    private void fullback() {
    response.setHeader(“Content-type”, “text/html;charset=UTF-8”);
    PrintWriter writer = null;
    try {
    writer = response.getWriter(); writer.println(“出错了,请重新刷新?”); writer.flush();;
    } catch (IOException e) {
    e.printStackTrace();
    }finally {
    if(writer != null){
    } }
    }

该方法只能在单机服务器中使用,如果使用分布式按照我上一篇文章进行操作

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值