SpringBoot单机限流的实现

 更新时间:2023年08月01日 11:06:47   作者:无敌少年小旋风  
在系统运维中, 有时候为了避免用户的恶意刷接口, 会加入一定规则的限流,本文主要介绍了SpringBoot单机限流的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

谷歌的 RateLimiter 介绍

使用谷歌的 guava 包中 RateLimiter 类来实现,先来介绍一个这个类:

  • RateLimiter 是一个频率限制器,通过配置频率来发放许可,如果 1 秒内可以访问十次,那么这十次许可发送的间隔是完全相同的
  • 并发使用是安全的
  • RateLimiter 还可以去配置先处于一个预热器,每秒增加发放的许可知道达到稳定的频率
  • RateLimiter 不影响请求本身的节流,而是影响下一次请求的节流,比如当前任务如果占用许可较多,到达 RateLimiter 之后,会立即占用,当下一个请求到达 RateLimiter 时就会经历节流,因为上一个请求已经占用大量的许可。

一个小示例用法,如果想要发送一组数据,我们限制他在 5kb 每秒:

// 给每一个字节发放 1 个许可,限制在 5kb 每秒的话,只需要每秒发放 5000 个许可即可
final RateLimiter rateLimiter = RateLimiter.create(5000.0);
void submitPacket(byte[] packet) {
   rateLimiter.acquire(packet.length);
   networkService.send(packet);
}

使用 AOP 实现单机限流

实现步骤:

  • 定义切面,拦截 Controller 层方法
  • 创建一个 RateLimiter,定义访问频率
  • 当执行方法时,发放一个许可,如果拿不到许可,直接拦截 Controller 层方法的执行,返回一个访问频繁的提示

Controller

@RestController
@RequestMapping("/rate")
public class RateController {
  @GetMapping
  public String testRate() {
    return "测试 Rate ";
  }
}

切面

@Component
@Aspect
public class ServiceLogAspect {
    /**
     * 对 controller 限流
     */
    @Pointcut("execution(* com.javagpt.back.controller.*.*(..))")
    public void rateLimitPointCut() {}
    private static final RateLimiter rateLimiter = RateLimiter.create(10);
    @SneakyThrows // 使用之后不需要抛出异常,lombok会自动在编译时加上try/catch
    @Around("rateLimitPointCut()")
    public Object rateLimit(ProceedingJoinPoint joinPoint) {
        double rate = rateLimiter.getRate();
        System.out.println(rate);
        if (rateLimiter.tryAcquire()) {
            return joinPoint.proceed();
        } else {
            // 如果超出限流次数,拦截方法的执行,注意这里返回的对象要和 Controller 方法的返回对象类型相同,否则会报错
            return "访问太过频繁";
        }
    }
}

到此这篇关于SpringBoot单机限流的实现的文章就介绍到这了,更多相关SpringBoot单机限流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot日志收集及链路追踪实现示例

    Spring Boot日志收集及链路追踪实现示例

    这篇文章主要为大家介绍了Spring Boot日志收集及链路追踪实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Java实战之药品管理系统的实现

    Java实战之药品管理系统的实现

    这篇文章主要介绍了利用Java实现的药品管理系统,本项目属于前后端分离的项目,分为两个角色药品管理员和取药处人员,感兴趣的小伙伴可以学习一下
    2022-04-04
  • SpringBoot 并发登录人数控制的实现方法

    SpringBoot 并发登录人数控制的实现方法

    这篇文章主要介绍了SpringBoot 并发登录人数控制的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Java中的方法内联介绍

    Java中的方法内联介绍

    大家好,本篇文章主要讲的是Java中的方法内联介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Spring Boot Actuator未授权访问漏洞的问题解决

    Spring Boot Actuator未授权访问漏洞的问题解决

    Spring Boot Actuator 端点的未授权访问漏洞是一个安全性问题,可能会导致未经授权的用户访问敏感的应用程序信息,本文就来介绍一下解决方法,感兴趣的可以了解一下
    2023-09-09
  • Java毕业设计实战之学生管理系统的实现

    Java毕业设计实战之学生管理系统的实现

    只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+Springboot+Maven+mybatis+Vue+Mysql实现学生管理系统,大家可以在过程中查缺补漏,提升水平
    2022-03-03
  • java如何动态执行while循环

    java如何动态执行while循环

    这篇文章主要介绍了java如何动态执行while循环问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • web.xml SpringBoot打包可执行Jar运行SpringMVC加载流程

    web.xml SpringBoot打包可执行Jar运行SpringMVC加载流程

    这篇文章主要为大家介绍了web.xml SpringBoot打包可执行Jar运行SpringMVC加载流程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • java打印菱形及直角和等腰三角形的方法

    java打印菱形及直角和等腰三角形的方法

    用Java输出菱形本身是一个比较简单的问题,这是Java初学者都要编写的一个算法,下面这篇文章主要给大家介绍了关于java打印菱形及直角和等腰三角形的方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Java网络编程TCP实现聊天功能

    Java网络编程TCP实现聊天功能

    这篇文章主要为大家详细介绍了Java网络编程TCP实现聊天功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论