Redis+Lua脚本+AOP+反射+自定义注解,打造内部基础架构限流组件

1.开发自定义限流注解给全团队赋能共用,一个注解搞定

2.可配置【时间窗口内可以随意灵活调整时间和次数】 + 可拔插

3.支持高并发【redis下干的】且满足事务一致性要求,lua脚本

注意!限流是在Controller层做的,不要干到Service层【做业务逻辑的】

1.自定义注解RedisLimitAnnotation实现业务解耦

2.高并发实时配置下的LuaScript处理

3.自定义AOP切面类

RedisLimitController

@Slf4j
@RestController
public class RedisLimitController{@GetMapping("/redis/limit/test")public String redisLimit(){return "业务正常返回,订单流水:" + IdUtil.fastUUID();}
}

限流后

时间窗口在这等价于redis 的 key的过期时间

@Slf4j 
@RestController
// 1秒内只允许2个人点击
@RedisLimitAnnotation(key = "redis-limit:test" , permitsPerSecond = 2,expire = 1, msg = "当前排队人数过多,请稍后再试!")
public class RedisLimitController{@GetMapping("/redis/limit/test")public String redisLimit(){return "业务正常返回,订单流水:" + IdUtil.fastUUID();}
}

RedisConfig

redis序列化的工具配置类【一定要开启】

public class RedisConfig{// 执行  keys *// 野生:"\xac\xed\x00\aord:102"  序列化后:"ord:102"@Beanpublic RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactor){RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactor);// 设置key序列化方式StringredisTemplate.setKeySerializer(new StringRedisSerializer());// 设置value的序列化方式json,使用GenericJackson2JsonRedisSerializer替换默认序列化redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());redisTemplate.afterPropertiesSet();return redisTemplate;}
}

RedisLimitAnnotation

@Retentiom(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Document
public @interface RedisLimitAnnotation{// 资源key唯一,不同接口不同流量控制 模拟Sentinel资源key resourceString key() default "";// 最多访问限制次数long permitsPerSecond() default 2;// 过期时间 滑动窗空时间 单位秒 默认60秒long expire() default 60;// 得不到令牌提示语String msg() default "系统繁忙 点击太快请稍后重试";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/772890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人直播(视频推流)

环境搭建 我这里采用的是ffmpeg来进行推流直播 yum -y install wgetwget --no-check-certificate https://www.johnvansickle.com/ffmpeg/old-releases/ffmpeg-4.0.3-64bit-static.tar.xztar -xJf ffmpeg-4.0.3-64bit-static.tar.xzcd ffmpeg-4.0.3-64bit-staticmv ffmpeg /u…

IOS面试题编程机制 71-75

71. 简述有哪几种手势通知方法?-(void)touchesBegan:(NSSet*)touchedwithEvent:(UIEvent*)event; -(void)touchesMoved:(NSSet*)touched withEvent:(UIEvent*)event; -(void)touchesEnded:(NSSet*)touchedwithEvent:(UIEvent*)event; -(void)touchesCanceled:(NSSet*)touchedw…

等级保护安全扩展要求测评对象分析汇总

&#xff08;1&#xff09;安全扩展要求建议新增测评对象 新技术新应用 建议补充测评对象 云计算 -虚拟设备&#xff08;包括虚拟机、虚拟网络设备、虚拟安全设备等&#xff09; -云操作系统、云业务管理平台、虚拟机监视器 -云租户网络控制器 -云应用开发平台 移动互联 -…

kubernetes-networkpolicies网络策略问题

kubernetes-networkpolicies网络策略问题 问题描述 重点重点重点&#xff0c;查看我的博客CKA考题&#xff0c;里面能找到解决方法 1.部署prometheus监控的时候&#xff0c;都部署成功&#xff0c;但是web访问503-504超时 2.添加ingress的时候也是访问不到&#xff0c;其他命…

寻找最大值最小值

Problem Finding both the minimum and maximum in an array of integers A[1..n] and assume for simplicity that n is a power of 2 A straightforward algorithm 1. x←A[1]; y←A[1] 2. for i←2 to n 3. if A[i] < x then x←A[i] 4. if A[i] > y then y←A[i…

代码随想录算法训练营第三十五天 |860.柠檬水找零 、406.根据身高重建队列、452. 用最少数量的箭引爆气球

目录 一、860. 柠檬水找零 二、406. 根据身高重建队列 二、452. 用最少数量的箭引爆气球 一、232. 用栈实现队列860. 柠檬水找零232. 用栈实现队列 题目链接&#xff1a;力扣 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a; 题目&#xff1a; 在柠檬水摊上&#…

gin语言基础学习--会话控制(下)

练习 模拟实现权限验证中间件 有2个路由&#xff0c;/cookie和/home/cookie用于设置cookiehome是访问查看信息的请求在请求home之前&#xff0c;先跑中间件代码&#xff0c;检验是否存在cookie 访问home&#xff0c;会显示错误&#xff0c;因为权限校验未通过 package mainim…

centos创建svn库步骤

1.切换root用户 1、设置root用户的密码&#xff1a; sudo passwd root 2、切换到root用户权限 su 3、切换回个人用户权限 exit 2.用root用户执行yum install -y subversion 3.创建文件夹mkdir -p /data/svn/repository 4.创建SVN 版本库 5.输入命令&#xff1a; svnadmin creat…

IDEA连接github.com连接超时 Invalid authentication data. connect time out 的问题解决(亲测有效)

问题&#xff1a; IDEA连接github.com连接超时 Invalid authentication data. connect time out 解决方案&#xff08;亲测有效&#xff09;&#xff1a; 修改host文件&#xff1a;打开 C:\Windows\System32\drivers\etc\hosts&#xff0c;文件末尾添加如下内容&#xff1a; …

checkpoint 大模型、VAE、LoRA、Embedding、Controlnet这些是什么模型

1. Checkpoint 大模型&#xff1a;Checkpoint 大模型是一种深度学习模型&#xff0c;通过将模型参数保存到磁盘上并随时恢复它们来避免重新训练模型的昂贵成本和时间。这种方法可以使用较少的内存和计算资源来加载大型模型&#xff0c;并在需要时恢复模型参数以进行预测。 2. V…

OriginBot智能机器人开源套件

详情可参见&#xff1a;OriginBot智能机器人开源套件——支持ROS2/TogetherROS&#xff0c;算力强劲&#xff0c;配套古月居定制课程 (guyuehome.com) OriginBot智能机器人开源套件 最新消息&#xff1a;OriginBot V2.1.0版本正式发布&#xff0c;新增车牌识别&#xff0c;点击…

Vue3基础笔记(2)事件

一.事件处理 1.内联事件处理器 <button v-on:click"count">count1</button> 直接将事件以表达式的方式书写~ 每次单击可以完成自增1的操作~ 2.方法事件处理器 <button click"addcount(啦啦啦~)">count2</button> 如上&…

VMware下建立CentOS 7

1.点击新建虚拟机 2.下一步 3.选择号安装程序光盘映像文件位置&#xff0c;下一步 4.选择版本和操作系统然后下一步 5.编辑虚拟机名称并选择安装位置&#xff0c;然后下一步 6.设置最大磁盘大小&#xff0c;下一步 7.点击完成 8.点击编辑虚拟机设置 9.将此虚拟机内存设置为2G&a…

MongoDB集成springboot

其中有三项配置比较关键&#xff1a; 第一&#xff1a;mongo依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> 第二&#xff1a;mongo配置 se…

中间件学习--InfluxDB部署(docker)及springboot代码集成实例

一、需要了解的概念 1、时序数据 时序数据是以时间为维度的一组数据。如温度随着时间变化趋势图&#xff0c;CPU随着时间的使用占比图等等。通常使用曲线图、柱状图等形式去展现时序数据&#xff0c;也就是我们常常听到的“数据可视化”。 2、时序数据库 非关系型数据库&#…

Day31:学习SpringCloud

学习计划&#xff1a;完成尚硅谷的尚上优选项目 学习进度&#xff1a;完成尚上优选项目的前置知识点&#xff1a;SpringCloud 知识点&#xff1a; 面试相关问题及源码 微服务篇 SpringCloud常见组件有哪些&#xff1f;Nacos的服务注册表结构是怎样的&#xff1f;Nacos如何支…

爬虫实践(1)

这一篇只提登录模拟&#xff0c;主要介绍chrome开发者窗口的使用&#xff0c;实际上相关接口调用都是用到cookie&#xff0c;需要再加一篇从token到cookie&#xff0c;以保证实践的完整性 以migu登录为例&#xff0c;分析其登录过程&#xff0c;之后可以使用任意语言模拟登录&…

P8687 [蓝桥杯 2019 省 A] 糖果

一、题目描述 P8687 [蓝桥杯 2019 省 A] 糖果 二、问题简析 由题意&#xff0c;糖果的种类 M M M 最多为 20 20 20&#xff0c;所以我们可以采用二进制位的方式来表示每包糖果的组成。具体&#xff1a;二进制的第 i i i 位表示第 i 1 i 1 i1 种糖果&#xff0c; 1 1 1…

Spark SQL DataFrame

Spark SQL DataFrame DataFrame是一个分布式数据集合&#xff0c;它被组织成命名列。从概念上讲&#xff0c;它相当于具有良好优化技术的关系表。 DataFrame可以从不同来源的数组构造&#xff0c;例如Hive表&#xff0c;结构化数据文件&#xff0c;外部数据库或现有RDD。这个…

小程序富文本图片宽度自适应

解决这个问题 创建一个util.js文件,图片的最大宽度设置为100%就行了 function formatRichText(html) {let newContent html.replace(/\<img/gi, <img style"max-width:100%;height:auto;display:block;");return newContent; }module.exports {formatRichT…