spring cloud gateway限流常见算法
目录
一、网关限流
1、限流的作用
1. 保护后端服务
2. 保证服务质量 (QoS)
3. 避免滥用和恶意攻击
4. 减少资源浪费
5. 提高系统可扩展性和稳定性
6. 控制不同用户的访问频率
7. 提升用户体验
8. 避免API滥用和负载过高
9. 监控与分析
10. 避免系统崩溃
2、网关限流的常见算法
1. 令牌桶算法 (Token Bucket)
2. 漏桶算法 (Leaky Bucket)
3. 计数器算法 (Counter-based)
3、令牌桶算法在gateway中的具体实现
前言:
我们在很多时候应该会遇到一种情况吧,比如说某些秒杀类型的商品在抢购的时候,你明显的感觉到这种情况,再例如大学生们应该都经历过的一件事,那就是每个学期必须经历的选课,每当选课开始的时候是不是总会刷新的时候一直进不去,这也是做了限流的原因。
一、网关限流
1、限流的作用
1. 保护后端服务
网关限流可以有效地控制进入系统的请求流量,避免后端服务因接收到过多的请求而过载或者崩溃。特别是在高并发场景下,后端系统的处理能力可能有限,限流可以确保请求不会超出后端服务的最大承载能力。
2. 保证服务质量 (QoS)
通过限流,网关可以确保所有用户或请求都有公平的机会访问系统资源,避免某些用户或请求因过度占用系统资源而影响其他正常用户的体验。限流有助于平衡系统负载,避免部分突发请求导致服务质量下降。
3. 避免滥用和恶意攻击
限流能够有效防止恶意用户或爬虫等非正常流量对系统的恶意攻击。比如,针对DDoS攻击(分布式拒绝服务)或暴力破解等恶意流量,网关通过限流可以限制每个IP或者每个用户的请求次数,从而防止系统被过载。
4. 减少资源浪费
如果没有限流,过多的请求可能会让系统资源(如CPU、内存、数据库连接等)处于超负荷状态,导致资源浪费或者资源耗尽。限流可以合理地限制请求数量,确保系统资源被有效利用,而不是被不必要的请求耗尽。
5. 提高系统可扩展性和稳定性
通过合理配置限流策略,网关能够帮助系统平衡流量,确保系统稳定运行,避免因负载过高而发生宕机或性能瓶颈。通过动态调整限流策略,还可以应对不同流量波动,提高系统的可扩展性。
6. 控制不同用户的访问频率
网关可以根据不同用户、IP地址或者API接口的不同需求配置不同的限流规则。比如,可以为VIP用户提供更高的请求频率限制,而普通用户则可以设置更严格的限流规则。这有助于实现服务质量差异化管理。
7. 提升用户体验
通过限流,可以避免系统在流量高峰期间过载导致的请求失败、响应延迟等问题,从而提升用户的体验。当系统能够持续稳定响应用户请求时,用户满意度会提高,且系统负载能够保持在合理范围。
8. 避免API滥用和负载过高
尤其在微服务架构中,API网关起到至关重要的作用。通过限流,API网关能够控制每个API接口的访问频率,防止某个API接口被频繁调用导致的性能问题,确保整个系统的API接口资源合理分配。
9. 监控与分析
限流机制还可以作为监控的一部分,帮助运营人员分析请求模式。通过记录哪些请求被限流,系统可以更好地了解哪些用户或哪些功能区域的负载较高,进而优化系统架构或流量分配。
10. 避免系统崩溃
如果网关不进行限流,系统在高并发流量下可能会因承载过多请求而崩溃,导致不可用。通过提前限制请求流量,网关可以有效避免这种情况,保持系统稳定运行。
2、网关限流的常见算法
1. 令牌桶算法 (Token Bucket)
令牌桶算法是最常见的限流算法之一,它通过控制请求的速率来实现限流。
- 工作原理:令牌桶会以固定的速率生成令牌,每当一个请求到达时,网关会检查桶中是否有令牌。如果有,则允许请求通过,并且从桶中消耗一个令牌;如果没有,则请求被拒绝或者等待令牌的生成。
- 优点:允许请求的突发流量,因为令牌桶可以存储令牌,支持请求的突发。
- 适用场景:适用于那些偶尔有突发流量的应用,比如API接口。
2. 漏桶算法 (Leaky Bucket)
漏桶算法也常用于限流,其基本思想是控制流量的平均速率。
- 工作原理:漏桶算法使用一个固定大小的桶,当请求到达时,如果桶中有空间,则请求可以进入桶中;如果桶已经满了,则新的请求会被丢弃。请求从桶中以固定速率“漏出”。
- 优点:防止突发流量导致系统过载,保证请求的流量是平稳的。
- 适用场景:适用于希望平滑流量,避免突发流量影响系统的场景。
3. 计数器算法 (Counter-based)
计数器算法通过对请求计数并进行周期性重置来实现限流。
- 工作原理:每次接收到请求时,都会增加一个计数器的值,当计数器达到预设的限制时,新的请求将被拒绝。计数器会在一段时间后(如每秒、每分钟)被重置为零。
- 优点:简单易实现。
- 缺点:可能存在短时间内请求数过多的问题,特别是在请求突发时。
3、令牌桶算法在gateway中的具体实现
spring cloud gateway 默认使用redis的RateLimter限流算法来实现。所以我们要使用首先需要引入redis的依赖。
<!--redis-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId><version>2.1.3.RELEASE</version>
</dependency>
在GatewayApplicatioin引导类中添加如下代码,KeyResolver用于计算某一个类型的限流的KEY也就是说,可以通过KeyResolver来指定限流的Key。
//定义一个KeyResolver@Beanpublic KeyResolver ipKeyResolver() {return new KeyResolver() {@Overridepublic Mono<String> resolve(ServerWebExchange exchange) {return Mono.just(exchange.getRequest().getRemoteAddress().getHostName());}};}
修改application.yml中配置项,指定限制流量的配置以及REDIS的配置
spring:cloud:gateway:routes:- id: goodsuri: lb://goodspredicates:- Path=/goods/**filters:- StripPrefix= 1- name: RequestRateLimiter #请求数限流 名字不能随便写 args:key-resolver: "#{@ipKeyResolver}"redis-rate-limiter.replenishRate: 1 #令牌桶每秒填充平均速率redis-rate-limiter.burstCapacity: 1 #令牌桶总容量redis:host: 192.168.200.128 #自己redis的ip和端口以及密码配置port: 6379
解释:
- burstCapacity:令牌桶总容量。
- replenishRate:令牌桶每秒填充平均速率。
- key-resolver:用于限流的键的解析器的 Bean 对象的名字。它使用 SpEL 表达式根据#{@beanName}从 Spring 容器中获取 Bean 对象。
通过在replenishRate
和中设置相同的值来实现稳定的速率burstCapacity
。设置burstCapacity
高于时,可以允许临时突发replenishRate
。在这种情况下,需要在突发之间允许速率限制器一段时间(根据replenishRate
),因为2次连续突发将导致请求被丢弃(HTTP 429 - Too Many Requests
)key-resolver: "#{@userKeyResolver}" 用于通过SPEL表达式来指定使用哪一个KeyResolver.
如上配置:
表示 一秒内,允许 一个请求通过,令牌桶的填充速率也是一秒钟添加一个令牌。最大突发状况 也只允许 一秒内有一次请求,可以根据业务来调整 。
在做好以上的所有配置之后,当你再次访问具体的微服务的时候,如果你访问的请求超过了每秒1个的速度,那么你就会被限流,页面会显示429错误。如图所示:
相关文章:

spring cloud gateway限流常见算法
目录 一、网关限流 1、限流的作用 1. 保护后端服务 2. 保证服务质量 (QoS) 3. 避免滥用和恶意攻击 4. 减少资源浪费 5. 提高系统可扩展性和稳定性 6. 控制不同用户的访问频率 7. 提升用户体验 8. 避免API滥用和负载过高 9. 监控与分析 10. 避免系统崩溃 2、网关限…...

本地使用docker部署DeepSeek大模型
1、相关技术介绍 1.1、RAG RAG(Retrieval Augmented Generation),即“检索,增强,生成”,用于提升自然语言处理任务的性能。其核心思想是通过检索相关信息来增强生成模型的能力,具体步骤如下&am…...
C++ 设计模式-外观模式
外观模式的定义 外观模式是一种 结构型设计模式,它通过提供一个简化的接口来隐藏系统的复杂性。外观模式的核心思想是: 封装复杂子系统:将多个复杂的子系统或组件封装在一个统一的接口后面。提供简单接口:为客户端提供一个更简单、更易用的接口,而不需要客户端直接与复杂…...

【Linux网络编程】应用层协议HTTP(请求方法,状态码,重定向,cookie,session)
🎁个人主页:我们的五年 🔍系列专栏:Linux网络编程 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 Linux网络编程笔记: https://blog.cs…...
SQL进阶技巧:如何统计用户跨端消费行为?
目录 0 问题描述 2 问题剖析 技术难点解析 3 完整解决方案 步骤1:构造全量日期平台组合 步骤2:用户行为标记 步骤3:最终关联聚合 4 核心技巧总结 5 复杂度评估 往期精彩 0 问题描述 支出表: Spending +-------------+---------+ | Column Name | Type | +-----…...

Fiddler笔记
文章目录 一、与F12对比二、核心作用三、原理四、配置1.Rules:2.配置证书抓取https包3.设置过滤器4、抓取App包 五、模拟弱网测试六、调试1.线上调试2.断点调试 七、理论1.四要素2.如何定位前后端bug 注 一、与F12对比 相同点: 都可以对http和https请求进行抓包分析…...

基于SpringBoot+Vue的老年人体检管理系统的设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

51c自动驾驶~合集51
我自己的原文哦~ https://blog.51cto.com/whaosoft/13320191 #毫末最新OAD 轨迹偏移学习助力端到端新SOTA~ 端到端自动驾驶技术在近年来取得了显著进展。在本研究中,我们提出了轨迹偏移学习,将传统的直接预测自车轨迹,转换为预测相对于…...
Redis 监视器:深入解析与实战指南
Redis 监视器:深入解析与实战指南 引言 随着互联网技术的飞速发展,企业对实时数据处理和高并发场景的需求日益增长。Redis作为一款高性能的内存数据库,在各个领域中得到了广泛应用,包括缓存、消息队列、实时数据分析等。然而&am…...

Java8适配的markdown转换html工具(FlexMark)
坐标地址: <dependency><groupId>com.vladsch.flexmark</groupId><artifactId>flexmark-all</artifactId><version>0.60.0</version> </dependency> 工具类代码: import com.vladsch.flexmark.ext.tab…...

超全Deepseek资料包,deepseek下载安装部署提示词及本地部署指南介绍
该资料包涵盖了DeepSeek模型的下载、安装、部署以及本地运行的详细指南,适合希望在本地环境中高效运行DeepSeek模型的用户。资料包不仅包括基础的安装步骤,还提供了68G多套独立部署视频教程教程,针对不同硬件配置的模型选择建议,以…...

Postman - Postman 导入 JSON 文件(导入集合或环境变量)
一、Postman 中的 JSON 文件 在 Postman 中导入的 JSON 文件通常是指集合(Collection)或环境变量(Environments) 集合是 Postman 中用于管理 API 请求的一种方式,可以通过导入 JSON 文件来加载一个集合 环境变量是 P…...

傅里叶分析之掐死教程
https://zhuanlan.zhihu.com/p/19763358 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析 不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸的是,傅里叶分析的公式看起来太复杂了,所以很多…...

实在智能与宇树科技、云深科技一同获评浙江省“人工智能服务商”、 “数智优品”等荣誉
近日,浙江省经信厅正式公布《2024 年浙江省人工智能应用场景、应用标杆企业、人工智能服务商及 “数智优品” 名单》。 实在智能获评浙江省“人工智能服务商”,核心产品 “实在 Agent 智能体” 入选 “数智优品”。一同获此殊荣的还有宇树科技、云深处科…...

SpringAI系列 - RAG篇(三) - ETL
目录 一、引言二、组件说明三、集成示例一、引言 接下来我们介绍ETL框架,该框架对应我们之前提到的阶段1:ETL,主要负责知识的提取和管理。ETL 框架是检索增强生成(RAG)数据处理的核心,其将原始数据源转换为结构化向量并进行存储,确保数据以最佳格式供 AI 模型检索。 …...
Leetcode2080:区间内查询数字的频率
题目描述: 请你设计一个数据结构,它能求出给定子数组内一个给定值的 频率 。 子数组中一个值的 频率 指的是这个子数组中这个值的出现次数。 请你实现 RangeFreqQuery 类: RangeFreqQuery(int[] arr) 用下标从 0 开始的整数数组 arr 构造…...
北斗导航 | 周跳探测算法(matlab源码)
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 周跳 1. 高次差法2. 相位减伪距法3. TurboEdit算法(MW+GF组合)4. 多项…...
Nginx实战_高性能Web服务器与反向代理的配置全解
1. 引言 1.1 Nginx简介 Nginx(发音为 “engine-x”)是一款轻量级、高性能的HTTP服务器和反向代理服务器。它以其高并发处理能力和低资源消耗而闻名,广泛应用于互联网企业中。Nginx不仅可以作为静态文件服务器,还可以通过反向代理功能与后端应用服务器协同工作。 1.2 Ngi…...

基于微信小程序的电影院订票选座系统的设计与实现,SSM+Vue+毕业论文+开题报告+任务书+指导搭建视频
本系统包含用户、管理员两个角色。 用户角色:注册登录、查看首页电影信息推荐、查看电影详情并进行收藏预定、查看电影资讯、在线客服、管理个人订单等。 管理员角色:登录后台、管理电影类型、管理放映厅信息、管理电影信息、管理用户信息、管理订单等。…...

MySQL智障离谱问题,删了库确还存在、也不能再创建同名库
1、问题 今天跟后端朋友接毕设单子的时候,后端穿过来的【weather.sql】这个文件没弄好,导致这个【weather】数据库的数据是错的,因此我用datagrip的GUI界面直接右键删除,结果就是tmd删不掉,ok,我只能在那新…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...