文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-02 00:00

关注

这篇文章主要讲解了“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之限流

限流的基础算法

令牌桶和漏桶

令牌桶和漏桶对比

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方式进行限流这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯