SpringBoot单机限流

news/2024/10/24 3:01:06/

文章目录

  • 如何实现单机限流
    • 谷歌的 RateLimiter 介绍
    • 使用 AOP 实现单机限流
      • Controller
      • 切面

如何实现单机限流

谷歌的 RateLimiter 介绍

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

  1. RateLimiter 是一个频率限制器,通过配置频率来发放许可,如果 1 秒内可以访问十次,那么这十次许可发送的间隔是完全相同的
  2. 并发使用是安全的
  3. RateLimiter 还可以去配置先处于一个预热器,每秒增加发放的许可知道达到稳定的频率
  4. 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 实现单机限流

实现步骤:

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

Controller

@RestController
@RequestMapping("/rate")
public class RateController {@GetMappingpublic 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 "访问太过频繁";}}}

http://www.ppmy.cn/news/989946.html

相关文章

openGauss学习笔记-23 openGauss 简单数据管理-时间/日期函数和操作符

文章目录 openGauss学习笔记-23 openGauss 简单数据管理-时间/日期函数和操作符23.1 时间日期操作符23.2 时间/日期函数23.3 TIMESTAMPDIFF23.4 EXTRACT23.5 date_part openGauss学习笔记-23 openGauss 简单数据管理-时间/日期函数和操作符 23.1 时间日期操作符 用户在使用时…

Netty简介

Netty Netty初体验基础概念Reactor模型传统的阻塞IO模型基础Reactor模型多线程Reactor模型 为什么要使用Netty? (NIO的框架,用于解决高并发出现的问题) *BIO:同步且阻塞的IO NIO:同步且非阻塞的IO(不是说线程&#x…

windows端口占用

1.查看当前端口被哪个进程占用了(进入到CMD中) netstat -ano|findstr "8990"输出结果为: TCP 127.0.0.1:8990 0.0.0.0:0 LISTENING 2700 我们发现8990端口被2700进程占用了 2.基于进程号找进程名称 tasklist|findstr "2700&qu…

SpringBoot 整合 MongoDB 连接 阿里云MongoDB

注:spring-boot-starter-data-mongodb 2.7.5;jdk 1.8 阿里云MongoDB是副本集实例的 在网上查找了一番,大多数都是教连接本地mongodb或者linux上的mongodb 阿里云上有java版连接教程,但它不是SpringBoot方法配置的,是手…

WPF实战学习笔记23-首页添加功能

首页添加功能 实现ITodoService、IMemoService接口&#xff0c;并在构造函数中初始化。新建ObservableCollection<ToDoDto>、 ObservableCollection<MemoDto>类型的属性&#xff0c;并将其绑定到UI中修改Addtodo、Addmemo函数&#xff0c;将添加功能添加 添加添加…

AI帮你制作海报

介绍 Microsoft Designer是由微软推出的图像处理软件&#xff0c;能够通过套用模板等方式快速完成设计加工&#xff0c;生成能够在社交媒体使用的图片。Designer的使用更为简单便捷&#xff0c;用户能够通过套用模板等方式快速完成设计加工&#xff0c;生成能够在社交媒体使用…

文件操作fread()

fread 是 C 语言中用于从文件中读取数据的函数。它可以读取指定数量的数据项到内存中。c size_t fread(void *ptr, size_t size, size_t count, FILE *stream);ptr&#xff1a;指向接收数据的内存块的指针。size&#xff1a;每个数据项的字节数。count&#xff1a;要读取的数据…

KafKa脚本操作

所有操作位于/usr/local/kafka_2.12-3.5.1/bin。 rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# pwd /usr/local/kafka_2.12-3.5.1/bin rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# ls connect-distributed.sh kafka-delegation-tokens.sh kafka-mirror-mak…