当前位置: 首页 > news >正文

springboot做接口限流

目录

  • 1. 依赖+全局配置
  • 2. 注解配置

1. 依赖+全局配置

  1. 引入依赖

            <dependency>
                <groupId>com.github.taptap</groupId>
                <artifactId>ratelimiter-spring-boot-starter</artifactId>
                <version>1.2</version>
            </dependency>
    
  2. application.yml基础配置
    taptap.ratelimiter 是一个基于 Redis 的分布式限流组件,它确实会将 API key 存入缓存,并进行计数,当超出了限制就会抛出异常。

    spring:
      ratelimiter:
        enabled: true
        redis-address: redis://ip:port
        redis-password: password
        redis-database: 2
        # 下面两个配置可选择性配置,一般是通过 @RateLimit 给具体的接口进行限流
        rate: 10  # 每秒允许10次请求
        window: 60  # 限流窗口为60秒
    
  3. AOP配置限流,全局限流(这一步可选,一般用注解限流)

    @Aspect
    @Component
    public class RateLimitAspect {
    
        @Autowired
        private RateLimiterService rateLimiterService;
    
        @Around("execution(* com.yourpackage.controller..*(..))")
        public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            Method method = signature.getMethod();
            RateLimit rateLimit = method.getAnnotation(RateLimit.class);
            if (rateLimit != null) {
                RateLimiterInfo limiterInfo = rateLimiterService.getRateLimiterInfo(joinPoint, rateLimit);
                // 执行限流逻辑
                if (!rateLimiterService.isAllowed(limiterInfo)) {
                    throw new RateLimitException("Too Many Requests");
                }
            }
            return joinPoint.proceed();
        }
    }
    

2. 注解配置

可通过@RateLimit注解给具体的接口进行限流配置。

    @ApiOperation("医保订单结算结果查询并通知到his")
    @PostMapping("/queryOrderInfo")
    @RateLimit(rate = 5, rateInterval = 10, keys = {"#queryOrderPmcDTO.payOrdId"})
    public ResultBean queryOrderInfo(@RequestBody QueryOrderPmcDTO queryOrderPmcDTO) {
        ...
    }

上面的限流配置策略就是:10秒内,只能请求5次,通过queryOrderPmcDTO.payOrdId作为计数标准,queryOrderPmcDTO.payOrdId相同的请求就计数+1。

当超过了窗口期(rateInterval = 10)之后,Redis中的key就会被清除。

可以使用三目表达式:

    @ApiOperation("医保订单结算结果查询并通知到his")
    @PostMapping("/queryOrderInfo")
    @RateLimit(rate = RATE, rateInterval = RATE_INTERVAL, keys = {"#queryOrderPmcDTO.payOrdId != null ? #queryOrderPmcDTO.payOrdId : #queryOrderPmcDTO.medOrgOrd"})
    public ResultBean queryOrderInfo(@RequestBody QueryOrderPmcDTO queryOrderPmcDTO) {
        ...
    }

上面的限流配置策略就是:10秒内,只能请求5次,通过queryOrderPmcDTO.payOrdId作为计数标准(如果payOrdId为空,就用medOrgOrd作为计数标准),queryOrderPmcDTO.payOrdId相同的请求就计数+1。

相关文章:

  • 基于SSM实现的bbs论坛系统功能实现四
  • JSX 的基础概述、优势与工作原理(babel解析为JS)
  • 关于 CUPTI samples 中 的 pc_sample case
  • git 的 Detached HEAD
  • Opencv 图像基本操作
  • 大白话React Hooks,新特性怎么用?
  • Diffusion Transformer(DiT)——将扩散过程中的U-Net换成ViT:近频繁用于视频生成与机器人动作预测(含清华PAD详解)
  • 从 0 到 1,用 Python 构建超实用 Web 实时聊天应用
  • C# Enumerable类 之 数据筛选
  • gradle学习-mac安装
  • 2025-02-27 学习记录--C/C++-PTA 7-31 字符串循环左移
  • hivePB级迁移方案
  • Python的那些事第三十四篇:基于 Plotly 的交互式图表与仪表板设计与应用
  • AI数字人开发,引领科技新潮流
  • MySQL—授权与权限回收
  • Vue3 Hooks:从原理到实战封装指南
  • Vue-Flow绘制流程图(Vue3+ElementPlus+TS)简单案例
  • Spring Retry 实现乐观锁重试
  • 【数据结构】二叉树(门槛极低的系统性理解)
  • React进阶之前端业务Hooks库(四)
  • 大兴西红门网站建设/北京seo方法
  • 吧网站做软件的软件/最近发生的热点新闻
  • 网站建设公司格/济南网络推广公司电话
  • 北京建站设计/成都互联网公司排名
  • 安徽网站建设天锐科技/百度权重怎么查询
  • 邯郸移动网站建设报价/公司优化是什么意思?