基于SpringAOP实现限流(自定义令牌桶)

如今高并发已经成为每个项目必须考虑的一点,但是对于用户量大的项目来说,在大并发量下,系统很有可能撑不住压力,导致数据库宕机甚至导致系统崩溃。

限流就成为解决这类问题的首选答案,如今市面上已经有了很多很成熟的框架,例如Alibaba的sentinel,Google提供的RateLimiter。在阅读了RateLimiter的源码后,我基于令牌桶模型实现了一种面向切面的限流方式,并且自己实现了底层的令牌桶模型(还需要优化)

1.项目所需依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2.自定义注解RateLimiter

 3.自定义实现底层令牌桶

基于令牌桶思想,按每1/qps的速率像令牌桶中添加令牌,当令牌桶中的令牌为空的时候,进行限流。我的实现中并没有真的具体出一个集合用来定时存入令牌桶,而是采用记录本次请求访问时间,与上一次请求访问时间,通过他们差值与传入令牌桶速率的关系来存入令牌,空间复杂度更低。

3.切面类

 效果展示

 我使用了Jmeter压测工具,对限流能力进行压测

这里我设置qps=100,使用jmeter工具每秒发起150个线程请求接口,重复两次

这个工具目前还存在有很多问题,我计划近期内进行优化,并且使用nacos的动态配置,尝试能否在程序运行时修改qps的值。 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LinkJii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值