SpringBoot单机限流

文章目录

如何实现单机限流

谷歌的 RateLimiter 介绍

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

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

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

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

使用 AOP 实现单机限流

实现步骤:

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

Controller

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

切面

java 复制代码
@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 "访问太过频繁";
        }
    }

}
相关推荐
mldong4 小时前
C# 开发者也有自己的轻量工作流引擎了:NuGet 装包,5 分钟跑通一条审批流
后端·c#·.net
xcl09255 小时前
幼儿托育系统开发实战:从需求分析到上线全流程指南
java·大数据·需求分析
吴声子夜歌5 小时前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
小小猪的春天5 小时前
Java 手写第一个 MCP Server:Spring AI MCP 半小时跑通
java·人工智能·spring boot·ai编程
find1star5 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
爱学堂IT分享6 小时前
鹤翔老师pmp项目管理培训认证考试课 (直播录播题库送学时证明)【共58课时】-51CTO学堂
后端
今天AI了吗6 小时前
DeepSeek Harness 深度解析:从评测架构到实战落地
java·网络·数据库·人工智能·架构·java-ee
王的宝库6 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
许彰午6 小时前
27-AuthService登录链路
java·低代码·架构
泡海椒6 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp