文档章节

Guava RateLimiter + AOP注解实现单机限流、统计QPS

铁骨铮铮
 铁骨铮铮
发布于 05/23 18:58
字数 333
阅读 13
收藏 5

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>18.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
</dependency>

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
博文 26
码字总数 14097
作品 0
东城
私信 提问
限流分析(Guava RateLimter)

一般系统为了防止服务被调用的QPS超出其承载能力,防止大流量压垮服务器造成雪崩后果,设计时往往会加入限流的逻辑。通过限流,当请求超出系统的服务能力时,系统可以采取拒绝服务/排队等待/...

robin-yao
2016/11/19
1K
1
接口限流算法:漏桶算法和令牌桶算法

漏桶算法 漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。这一点和线程池原理是很相似的。 把请求比作是水,水来了都先放进桶里,并以限定...

铁骨铮铮
05/23
0
0
服务流量控制及限流

服务流量控制及限流 青蜂侠2017-07-2821 阅读 服务控制 工作上在开发类似 淘宝开放平台 的点评到综的开放平台,需要针对不同的API做流量控制,后期还需要针对不同属性的服务商(上线状态,部...

青蜂侠
2017/07/28
0
0
基于分布式环境下限流系统的设计

前提 业务背景 就拿前些天的双十一的 “抢券活动” 来说,一般是设置整点开始抢的,你想想,淘宝的用户群体非常大,可以达到亿级别,而服务接口每秒能处理的量是有限的,那么这个时候问题就会...

t4i2b10X4c22nF6A
2017/11/18
0
0
Spring Aop 配合 guava RateLimiter 实现应用层限流

现在微服务玩的越来越多 一些基础部件也是必不可少的,比如 服务熔断,服务降级,服务限流。在流量突发的情况下 系统性能随着往往随着量的增大而显得越来越弱,类似dos攻击 。 甚至到后期产生...

liangbo
2016/10/25
224
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周五乱弹 —— 你不会知道老板在女装大佬面前多主动

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享闻音合唱团的单曲《君をのせて(天空之城)》: 喜欢这样的合唱#今日歌曲推荐# 《君をのせて(天空之城)》- 闻音合唱团 手机党...

小小编辑
25分钟前
151
3
两数的最大公约数

hello,复习一下数学知识! 最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。 因为之前做一个小功能,需要先计算一下数组的最大公约数,所以我就想记录一下...

woshixin
今天
3
0
学习Node.js的电子书大全

在这里,与大家分享一批很有用的 Node.js 的电子书资源。Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念。它的目标是帮助程序员构建高度可伸缩的应用程序,编写...

jay603
今天
68
0
《伟大的博弈》读后感作文4100字

《伟大的博弈》读后感作文4100字: 五一小长假,作为工厂员工,没能跟上大家放假的步伐,窝家里两天没出门,逼着自己看完《伟大的博弈》,感触颇多。似乎不能消化,先记录第一遍作为幼稚的见...

原创小博客
昨天
5
0
单点登录-基于Redis+MySQL实现单点登录(SSO)

1. 为什么要用单独登录? 主要便于公司内部多系统统一认证授权管理,一次登录可访问多个跨域系统,也同时更加方便统一管理用户登录(员工离职需要拿掉登录权限、统计所有用户对系统的登录请求...

秋日芒草
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部