iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >SpringBoot怎么使用RateLimiter通过AOP方式进行限流
  • 322
分享到

SpringBoot怎么使用RateLimiter通过AOP方式进行限流

2023-07-02 00:07:32 322人浏览 薄情痞子
摘要

这篇文章主要讲解了“SpringBoot怎么使用RateLimiter通过aop方式进行限流”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springBoot怎么使用RateLimiter通

这篇文章主要讲解了“SpringBoot怎么使用RateLimiter通过aop方式进行限流”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springBoot怎么使用RateLimiter通过AOP方式进行限流”吧!

使用RateLimiter通过AOP方式进行限流

1、引入依赖

<!-- guava 限流 --><dependency>     <groupId>com.Google.guava</groupId>     <artifactId>guava</artifactId>     <version>25.1-jre</version></dependency>

2、自定义注解

@Target({ElementType.PARAMETER, ElementType.METHOD})    @Retention(RetentionPolicy.RUNTIME)    @Documented    public  @interface ServiceLimit {      String description()  default "";}

3、AOP实现类

@Component@Scope@Aspectpublic class LimitAspect {    每秒只发出5个令牌,此处是单进程服务的限流,内部采用令牌捅算法实现    private static   RateLimiter rateLimiter = RateLimiter.create(5.0);        //Service层切点  限流    @Pointcut("@annotation(com.itstyle.seckill.common.aop.ServiceLimit)")      public void ServiceAspect() {            }        @Around("ServiceAspect()")    public  Object around(ProceedingJoinPoint joinPoint) {         Boolean flag = rateLimiter.tryAcquire();        Object obj = null;        try {            if(flag){                obj = joinPoint.proceed();            }        } catch (Throwable e) {            e.printStackTrace();        }         return obj;    } }

4、使用

@Override@ServiceLimit@Transactional    public Result startSeckil(long seckillId,long userId) {        //todo 操作    }

SpringBoot之限流

限流的基础算法

令牌桶和漏桶

  • 漏桶算法 的实现往往依赖于队列,请求到达如果队列未满则直接放入队列,然后有一个处理器按照固定频率从队列头取出请求进行处理。如果请求量大,则会导致队列满,那么新来的请求就会被抛弃。

  • 令牌桶算法 则是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。桶中存放的令牌数有最大上限,超出之后就被丢弃或者拒绝。当流量或者网络请求到达时,每个请求都要获取一个令牌,如果能够获取到,则直接处理,并且令牌桶删除一个令牌。如果获取不到,该请求就要被限流,要么直接丢弃,要么在缓冲区等待。

令牌桶和漏桶对比

  • 令牌桶是按照固定速率往桶中添加令牌,请求是否被处理需要看桶中令牌是否足够,当令牌数减为零时则拒绝新的请求;漏桶则是按照常量固定速率流出请求,流入请求速率任意,当流入的请求数累积到漏桶容量时,则新流入的请求被拒绝;

  • 令牌桶限制的是平均流入速率,允许突发请求,只要有令牌就可以处理,支持一次拿3个令牌,4个令牌;漏桶限制的是常量流出速率,即流出速率是一个固定常量值,比如都是1的速率流出,而不能一次是1,下次又是2,从而平滑突发流入速率;

  • 令牌桶允许一定程度的突发,而漏桶主要目的是平滑流出速率;

Guava RateLimiter

依赖

<dependency>    <groupId>com.google.guava</groupId>    <artifactId>guava</artifactId>    <version>28.1-jre</version>    <optional>true</optional></dependency>

2.示例代码 

@Slf4j@Configurationpublic class RequestInterceptor implements HandlerInterceptor {    // 根据字符串分不同的令牌桶, 每天自动清理缓存    private static LoadinGCache<String, RateLimiter> cachesRateLimiter = CacheBuilder.newBuilder()            .maximumSize(1000)  //设置缓存个数                        .expireAfterAccess(1, TimeUnit.HOURS)            .build(new CacheLoader<String, RateLimiter>() {                @Override                public RateLimiter load(String key) throws Exception {                    // 新的字符串初始化 (限流每秒2个令牌响应)                    return RateLimiter.create(2);                }            });    @Override    public boolean preHandle(httpservletRequest request, HttpServletResponse response, Object handler)            throws Exception {        log.info("request请求地址path[{}] uri[{}]", request.getServletPath(), request.getRequestURI());        try {            String str = "hello";            // 令牌桶            RateLimiter rateLimiter = cachesRateLimiter.get(str);            if (!rateLimiter.tryAcquire()) {                System.out.println("too many requests.");                return false;            }        } catch (Exception e) {            // 解决拦截器的异常,全局异常处理器捕获不到的问题            request.setAttribute("exception", e);            request.getRequestDispatcher("/error").forward(request, response);        }        return true;    }}

3.测试

@RestController@RequestMapping(value = "user")public class UserController {    @GetMapping    public Result test2(){        System.out.println("1111");        return new Result(true,200,"");    }}

http://localhost:8080/user/

如果没有result类,自己可以随便返回个字符串

4.测试结果

SpringBoot怎么使用RateLimiter通过AOP方式进行限流

其他

创建

RateLimiter提供了两个工厂方法:

一个是平滑突发限流

RateLimiter r = RateLimiter.create(5); //项目启动,直接允许5个令牌

一个是平滑预热限流

RateLimiter r = RateLimiter.create(2, 3, TimeUnit.SECONDS); //项目启动后3秒后才会到达设置的2个令牌

缺点

RateLimiter只能用于单机的限流,如果想要集群限流,则需要引入redis或者阿里开源的sentinel中间件

TimeUnit.SECONDS);` //项目启动后3秒后才会到达设置的2个令牌

感谢各位的阅读,以上就是“SpringBoot怎么使用RateLimiter通过AOP方式进行限流”的内容了,经过本文的学习后,相信大家对SpringBoot怎么使用RateLimiter通过AOP方式进行限流这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: SpringBoot怎么使用RateLimiter通过AOP方式进行限流

本文链接: https://www.lsjlt.com/news/338643.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot怎么使用RateLimiter通过AOP方式进行限流
    这篇文章主要讲解了“SpringBoot怎么使用RateLimiter通过AOP方式进行限流”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot怎么使用RateLimiter通...
    99+
    2023-07-02
  • SpringBoot如何使用RateLimiter通过AOP方式进行限流
    目录使用RateLimiter通过AOP方式进行限流1、引入依赖2、自定义注解3、AOP实现类4、使用SpringBoot之限流限流的基础算法Guava RateLimiter其他使...
    99+
    2024-04-02
  • 使用springboot整合RateLimiter限流过程
    目录RateLimiter令牌桶原理图原理方法摘要开始贴代码代码贴完了,开始测试RateLimiter官方文档 RateLimiter令牌桶原理图 随着时间流逝,系统会按恒定1/Q...
    99+
    2024-04-02
  • 使用SpringBoot怎么对Spring AOP进行集成
    今天就跟大家聊聊有关使用SpringBoot怎么对Spring AOP进行集成,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。需要的jar包添加到工程里。新增Maven依赖如下:<...
    99+
    2023-05-31
    springboot spring aop
  • 怎么使用AOP+redis+lua做限流
    这篇“怎么使用AOP+redis+lua做限流”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用AOP+redis+lu...
    99+
    2023-06-30
  • 在springboot中怎么使用AOP进行全局日志记录
    小编给大家分享一下在springboot中怎么使用AOP进行全局日志记录,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1、 spring AOP 是什么?spring 的两大核心就是 IOC 和 AOP,AOP 是 spr...
    99+
    2023-06-21
  • SpringBoot中使用Redis对接口进行限流的实现
    目录实现的思路 使用 Hash 存储接口的限流配置 使用普通kv,存储api的请求次数 使用SpringBoot实现 RedisKeys ObjectRedisTemplate Re...
    99+
    2024-04-02
  • 使用SpringBoot + Redis 实现接口限流的方式
    目录配置限流注解定制 RedisTemplateLua 脚本注解解析接口测试全局异常处理Redis 除了做缓存,还能干很多很多事情:分布式锁、限流、处理请求接口幂等性。。。太多太多了...
    99+
    2024-04-02
  • Java怎么使用Semaphore对单接口进行限流
    这篇文章主要讲解了“Java怎么使用Semaphore对单接口进行限流”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么使用Semaphore对单接口进行限流”吧!目录一、实战说明1...
    99+
    2023-06-20
  • 如何通过Ajax方式上传文件使用FormData进行Ajax请求
    这篇文章主要为大家展示了“如何通过Ajax方式上传文件使用FormData进行Ajax请求”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何通过Ajax方式上传...
    99+
    2024-04-02
  • springboot怎么通过URL方式访问外部资源
    这篇文章主要讲解了“springboot怎么通过URL方式访问外部资源”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springboot怎么通过URL方式访问外部资源”吧!springboo...
    99+
    2023-06-21
  • Springboot使用filter对response内容进行加密方式
    目录使用filter对response内容进行加密编写加密类(AES)编写Filter类写配置类Springboot数据加密传输创建加解密注解注解创建request解密类创建resp...
    99+
    2024-04-02
  • 使用mybatis的typeHandler对clob进行流读写方式
    目录typeHandler对clob进行流读写第一步:编写typehandler文件第二步:在mybatis的配置文件中添加<typeHandlers>节点第三步myba...
    99+
    2024-04-02
  • redisson分布式限流RRateLimiter怎么使用
    今天小编给大家分享一下redisson分布式限流RRateLimiter怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-07-04
  • AJAX怎么使用XML文件进行交互式通信
    本文小编为大家详细介绍“AJAX怎么使用XML文件进行交互式通信”,内容详细,步骤清晰,细节处理妥当,希望这篇“AJAX怎么使用XML文件进行交互式通信”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,...
    99+
    2024-04-02
  • Android怎么使用GRPC进行通信
    这篇文章主要介绍“Android怎么使用GRPC进行通信”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么使用GRPC进行通信”文章能帮助大家解决问题。引言Android作为一个开发平...
    99+
    2023-07-05
  • 怎么通过命令行方式重启Ubuntu系统
    当你想要通过命令行方式重启 Ubuntu 系统时,可以按照以下步骤操作: 打开终端:你可以通过按下 Ctrl + Alt + T ...
    99+
    2024-04-08
    Ubuntu
  • Springboot如何使用filter对response内容进行加密方式
    这篇文章主要介绍Springboot如何使用filter对response内容进行加密方式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用filter对response内容进行加密编写加密类(AES)public&...
    99+
    2023-06-29
  • springboot中怎么通过main方法调用service或dao
    这篇文章主要介绍“springboot中怎么通过main方法调用service或dao”,在日常操作中,相信很多人在springboot中怎么通过main方法调用service或dao问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-06-29
  • 使用Holer怎么通过外网访问本地SpringBoot
    本篇文章给大家分享的是有关使用Holer怎么通过外网访问本地SpringBoot,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 准备工作1.1 安装Java 1.7及以上版...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作