最新要闻
- 天天新消息丨电动车价格有得降!“白色石油”碳酸锂价格雪崩:有公司濒临破产
- 世界快资讯丨局地阵风10级!北京发布大风沙尘暴双黄色预警:空气质量严重污染
- 环球播报:日本拉面店禁止边吃边看手机!店长给出的理由看醉了:有损厨师尊严
- 4个月了!AMD RX 7900 XTX旗舰卡终于降价:一度杀到6399元 降幅20%
- 世界快播:Nimo全球盛典圆满举行 提速布局全球化业务
- 当前观点:客车司机开车途中嗦粉吓坏乘客 双手离开方向盘:官方回应
- HTC发布Wildfire入门级4G手机:国产展锐处理器、3G内存
- 焦点速看:中国人自己的智能车身控制系统!比亚迪云辇实现0-1突破:填补国内技术空白
- 全球时讯:比亚迪云辇发布 王传福:传统豪华看车标、新能源豪华看技术
- 全球车身控制技术最高水平:比亚迪U9搭云辇X“跳舞”登台
- 伊宝馨2022年净利3220.96万同比增长161.43% 销售规模增加
- 观点:未势能源首发“木星”车载液氢储氢系统:一罐氢气续航超1000km
- 最新消息:你掉的不是头发 而是“钻石”!
- 世界速读:长辈送礼绝不踩坑!平仄普洱茶大促:高档礼盒装到手99元
- 就等小米13 Ultra发布了!米粉晒工资:称“资金已到位”
- 比亚迪云辇技术来了:四套系统 汽车会自己“看路”
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
全球速递!中小型项目请求限流设计
何为请求限流?
请求限流是一种控制API或其他Web服务的流量的技术。它的目的是限制客户端对服务器发出的请求的数量或速率,以防止服务器过载或响应时间变慢,从而提高系统的可用性和稳定性。
中小型项目请求限流的需求
- 按IP、用户、全局限流
- 基于不同实现的限流设计(基于Redis或者LRU缓存)
- 基于注解标注哪些接口限流
完整限流设计实现在开源项目中:https://github.com/valarchie/AgileBoot-Back-End
(资料图)
注解设计
声明一个注解类,主要有以下几个属性
- key(缓存的key)
- time(时间范围)
- maxCount(时间范围内最大的请求次数)
- limitType(按IP/用户/全局进行限流)
- cacheType(基于Redis或者Map来实现限流)
/** * 限流注解 * * @author valarchie */@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface RateLimit { /** * 限流key */ String key() default "None"; /** * 限流时间,单位秒 */ int time() default 60; /** * 限流次数 */ int maxCount() default 100; /** * 限流条件类型 */ LimitType limitType() default LimitType.GLOBAL; /** * 限流使用的缓存类型 */ CacheType cacheType() default CacheType.REDIS;}
LimitType枚举,我们可以将不同限制类型的逻辑直接放在枚举类当中。推荐将逻辑直接放置在枚举类中,代码的组织形式会更好。
enum LimitType { /** * 默认策略全局限流 不区分IP和用户 */ GLOBAL{ @Override public String generateCombinedKey(RateLimit rateLimiter) { return rateLimiter.key() + this.name(); } }, /** * 根据请求者IP进行限流 */ IP { @Override public String generateCombinedKey(RateLimit rateLimiter) { String clientIP = ServletUtil.getClientIP(ServletHolderUtil.getRequest()); return rateLimiter.key() + clientIP; } }, /** * 按用户限流 */ USER { @Override public String generateCombinedKey(RateLimit rateLimiter) { LoginUser loginUser = AuthenticationUtils.getLoginUser(); if (loginUser == null) { throw new ApiException(ErrorCode.Client.COMMON_NO_AUTHORIZATION); } return rateLimiter.key() + loginUser.getUsername(); } }; public abstract String generateCombinedKey(RateLimit rateLimiter); }
CacheType, 主要分为Redis和Map, 后续有新的类型可以新增。
enum CacheType { /** * 使用redis做缓存 */ REDIS, /** * 使用map做缓存 */ Map }
RateLimitChecker设计
声明一个抽象类,然后将具体实现放在实现类中,便于扩展
/** * @author valarchie */public abstract class AbstractRateLimitChecker { /** * 检查是否超出限流 * @param rateLimiter */ public abstract void check(RateLimit rateLimiter);}
Redis限流实现
/** * @author valarchie */@Component@RequiredArgsConstructor@Slf4jpublic class RedisRateLimitChecker extends AbstractRateLimitChecker{ @NonNull private RedisTemplate
Map + Guava RateLimiter实现
/** * @author valarchie */@SuppressWarnings("UnstableApiUsage")@Component@RequiredArgsConstructor@Slf4jpublic class MapRateLimitChecker extends AbstractRateLimitChecker{ /** * 最大仅支持4096个key 超出这个key 限流将可能失效 */ private final LRUCache cache = new LRUCache<>(4096); @Override public void check(RateLimit rateLimit) { String combinedKey = rateLimit.limitType().generateCombinedKey(rateLimit); RateLimiter rateLimiter = cache.get(combinedKey, () -> RateLimiter.create((double) rateLimit.maxCount() / rateLimit.time()) ); if (!rateLimiter.tryAcquire()) { throw new ApiException(ErrorCode.Client.COMMON_REQUEST_TOO_OFTEN); } log.info("限制请求key:{}, combined key:{}", rateLimit.key(), combinedKey); }}
限流切面
我们需要在切面中,读取限流注解标注的信息,然后选择不同的限流实现来进行限流。
/** * 限流切面处理 * * @author valarchie */@Aspect@Component@Slf4j@ConditionalOnExpression(""${agileboot.embedded.redis}" != "true"")@RequiredArgsConstructorpublic class RateLimiterAspect { @NonNull private RedisRateLimitChecker redisRateLimitChecker; @NonNull private MapRateLimitChecker mapRateLimitChecker; @Before("@annotation(rateLimiter)") public void doBefore(JoinPoint point, RateLimit rateLimiter) { MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); log.info("当前限流方法:" + method.toGenericString()); switch (rateLimiter.cacheType()) { case REDIS: redisRateLimitChecker.check(rateLimiter); break; case Map: mapRateLimitChecker.check(rateLimiter); return; default: redisRateLimitChecker.check(rateLimiter); } }}
注解使用
以下是我们标注的注解例子。
time=10,maxCount=10表明10秒内最多10次请求。
cacheType=Redis表明使用Redis来实现。
limitType=IP表明基于IP来限流。
/** * 生成验证码 */@Operation(summary = "验证码")@RateLimit(key = RateLimitKey.LOGIN_CAPTCHA_KEY, time = 10, maxCount = 10, cacheType = CacheType.REDIS, limitType = LimitType.IP)@GetMapping("/captchaImage")public ResponseDTO getCaptchaImg() { CaptchaDTO captchaImg = loginService.generateCaptchaImg(); return ResponseDTO.ok(captchaImg);}
这是笔者关于中小型项目关于请求限流的实现,如有不足欢迎大家评论指正。
全栈技术交流群:1398880
关键词:
天天新动态:前端工程化实战:React 模块化开发、性能优化和组件化实践
每日时讯!ADMM——交替方向乘子法
全球速递!中小型项目请求限流设计
天天新消息丨电动车价格有得降!“白色石油”碳酸锂价格雪崩:有公司濒临破产
世界快资讯丨局地阵风10级!北京发布大风沙尘暴双黄色预警:空气质量严重污染
全球消息!解释一下布隆过滤器原理
世界通讯!mit 6.824 lab1分析
每日热点:AQS源码学习
环球播报:日本拉面店禁止边吃边看手机!店长给出的理由看醉了:有损厨师尊严
4个月了!AMD RX 7900 XTX旗舰卡终于降价:一度杀到6399元 降幅20%
世界快播:Nimo全球盛典圆满举行 提速布局全球化业务
最新:screenfetch报错 /usr/bin/screenfetch: 行 1851: -: 语法错误:需要操作数(错误记号是 "-") 的一种解决方法
天天精选!直线光栅化-Bresenham算法
当前观点:客车司机开车途中嗦粉吓坏乘客 双手离开方向盘:官方回应
HTC发布Wildfire入门级4G手机:国产展锐处理器、3G内存
焦点速看:中国人自己的智能车身控制系统!比亚迪云辇实现0-1突破:填补国内技术空白
全球时讯:比亚迪云辇发布 王传福:传统豪华看车标、新能源豪华看技术
全球车身控制技术最高水平:比亚迪U9搭云辇X“跳舞”登台
伊宝馨2022年净利3220.96万同比增长161.43% 销售规模增加
天天视讯!百度松果菁英班--oj赛(第一次)
观点:未势能源首发“木星”车载液氢储氢系统:一罐氢气续航超1000km
最新消息:你掉的不是头发 而是“钻石”!
世界速读:长辈送礼绝不踩坑!平仄普洱茶大促:高档礼盒装到手99元
就等小米13 Ultra发布了!米粉晒工资:称“资金已到位”
比亚迪云辇技术来了:四套系统 汽车会自己“看路”
焦点速读:Android开发_记事本(2)数据库
领失业金的年轻人,重新思考工作的意义
看点:北上高铁出现大规模晚点 官方回应:故障抢修完毕 有序恢复通行
环球快讯:马斯克离开OpenAI内幕:大权独揽想法被拒 10亿美元打水漂
形同灾难电影!四子王旗沙尘暴红警:天空变橙红色
全球时讯:好吃无负担:诺梵55%~100%黑巧巧克力9.9元大促
全球今头条!Windmill 搭建个人任务中心
环球微头条丨市建局协办活动 重塑龙城特色风情
环球快播:水平接近ChatGPT!昆仑万维国产大语言模型“天工”3.5来了
世界热门:《铁甲小宝》高清重制引热议 网友:这次好好看看小姐姐
苦等703天后 《生化危机8村庄》Denuvo加密移除:正版玩家终于不卡了
售价20多万续航仅160公里 日系车工业垃圾果然凉凉:今年只卖出15辆
环球新资讯:1TB手机干到2599元 手机降价原因找到了:闪存市场暴跌
欧菲光:公司已预约4月28日披露2022年度报告
天天最资讯丨借力函数计算 FC,HEROZ 打造专业级 AI 日本将棋服务
Excelize 发布 2.7.1 版本,Go 语言 Excel 文档基础库
环球今头条!WebAssembly 助力云原生:APISIX 如何借助 Wasm 插件实现扩展功能?
世界速看:记录-html-docs-js避坑指南
阿里正式加入ChatGPT战局,“通义千问”上线后表现如何?
全球消息!债市日报:4月10日
焦点关注:重磅!亚洲最大推力液体火箭发动机试车台调试完成
视焦点讯!堆料最足超大杯!小米13 Ultra确认可变光圈+全焦段四摄
全优大七座SUV!全新一代揽月正式上市 18.99万元起售
环球最新:2人观影全程用手机录制电影内容 目击者:中途还换了一个手机
米哈游《崩坏星穹铁道》姬子角色PV:成熟妩媚的大姐姐
今日快讯:“算力中国行”大型调研采访活动启动,将深入各地了解算力应用发展情况
天天日报丨刷题疑惑3
今日观点!TCP三次握手和四次挥手
【环球报资讯】收评:人工智能板块跳水 10只注册制主板新股大涨
播报:ChatGPT消除无聊的工作 诺奖得主:人类上四休三就靠AI
对标特斯拉Model Y 小鹏G6再放送 博主:兴奋起来吧、有电动尾翼
《名侦探柯南:黑铁的鱼影》新宣传图 成人版灰原哀太劲爆
精彩看点:第三次!沈腾主演《满江红》宣布密钥再次延期:上映至5月15日
亚马逊安抚员工:公司并没有在AI竞争中落下
天天微资讯!私募巨头阿波罗:美国信贷紧缩已开始
全球信息:【AIGC】ChatGPT 相关分享
互联网+医疗|如何满足各项安全合规要求
全球新资讯:一代“金牌配角” 中国香港知名演员吴耀汉去世:终年83岁
世界热消息:单核性能猛增68% 龙芯确认下代CPU性能达市场主流水平
【全球速看料】已做到笔记本电脑大小 国产量子计算机再进化:三大产品升级
环球信息:撞脸苹果!金立发布F1 Plus手机:刘海屏设计 国产8核CPU
《生化危机4:重制版》艾达王配音首次发声:亚裔女演员不止是花瓶
今日热文:广东2023年注会考试报名系统
世界即时:低至200元 / 月,火山引擎DataLeap帮你搭建企业级数据中台
天天短讯!奔驰EQG将采用革命性电池技术:续航、充电性能大增
全球看热讯:又是单踏板让车失控?重庆一特斯拉突然加速撞7车:官方确认车没问题驾驶员全责
mp3是什么格式的文件?怎么下载歌曲到MP3上?
怎么增大电脑虚拟内存页面文件大小?电脑虚拟内存页面怎么设置?
荣耀7i上市时间及价格是什么?荣耀7i配置和参数
英雄联盟s24赛季什么时候开始的?英雄联盟s24赛季结束时间
东部战区重磅发布:砺剑亮剑,驱虎打狐
天天短讯!Github使用教程
新资讯:在.NET7中使用MQTTnet简单实现MQTT通信
dnf成就格林赛罗斯战场怎么进?dnf成就格林赛罗斯战场任务怎么做?
焦点速读:击败《冰雪奇缘2》创新世界纪录!《超级马力欧兄弟》5天狂揽26亿票房
每日热文:自动驾驶是忽悠?蔚来李斌:目标是解放时间 减少事故
当前快讯:269元 米家快煮电饭煲4L预售:25分钟即熟
手工扯面+秘制辣油 西安饭庄油泼biangbiang面大促:6.66元/盒
用 Go 剑指 Offer 40. 最小的k个数 (Top K 问题)
快看点丨Web渗透测试流程
重点聚焦!SonarQube(CE)版集群环境下的高可用性实践
当前短讯!Java-泛型机制详解
最新快讯!Go常用库之GoRequests
十五五规划时期,未来十大新兴产业有哪些
世界视点!中兴Axon Pad来了:全球唯一5G双系统平板
医生误判将女孩恒牙当乳牙拔掉 科普:恒牙和乳牙区别
当前关注:日系车在中国真不香了!丰田、本田、日产、马自达全线暴跌
快资讯:iOS 16.4体验大翻车!苹果关闭降级通道:只许升新版
天天即时看!80/90后回忆杀!经典日漫《铁甲小宝》高清修复了:画质提升明显
【环球新要闻】全文索引:Apache Lucene(二)
Selenium做Web自动化踩过的坑
每日聚焦:通俗解释 JVM CAS 机制
世界观点:4月10日11时浙江嘉兴疫情最新消息 4月10日11时浙江嘉兴今日确诊人数
每日快播:米家空调巨省电首销:2匹大风量 2799元
环球热点!小米MIJIA智能音频眼镜发布!独特耳机眼镜二合一设计