spring cloud gateway限流常见算法

news2025/2/21 10:15:07

目录

一、网关限流

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
    @Bean
    public KeyResolver ipKeyResolver() {
        return new KeyResolver() {
            @Override
            public Mono<String> resolve(ServerWebExchange exchange) {
                return Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
            }
        };
    }

        修改application.yml中配置项,指定限制流量的配置以及REDIS的配置

spring:
  cloud:
    gateway:
      routes:
      - id: goods
        uri: lb://goods
        predicates:
        - 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错误。如图所示:

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

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

相关文章

网络安全的态势如何以及如何解决?

大家好,我是AI拉呱,一个专注于人工智领域与网络安全方面的博主,现任资深算法研究员一职,兼职硕士研究生导师;热爱机器学习和深度学习算法应用,深耕大语言模型微调、量化、私域部署。曾获多次获得AI竞赛大奖,拥有多项发明专利和学术论文。对于AI算法有自己独特见解和经验…

2026考研趋势深度解析:政策变化+高效工具指南

2026考研深度解析&#xff1a;趋势洞察高效工具指南&#xff0c;助你科学备战上岸 从政策变化到工具实战&#xff0c;这份千字攻略解决99%考生的核心焦虑 【热点引入&#xff1a;考研赛道进入“高难度模式”】 2025年全国硕士研究生报名人数突破520万&#xff0c;报录比预计扩…

AI工具篇:利用DeepSeek+Kimi 辅助生成综述汇报PPT

随着科研和学术报告需求的增加&#xff0c;如何高效地准备一份结构清晰、内容充实的PPT已成为许多研究者的挑战。 传统的PPT制作过程繁琐&#xff0c;需要大量文献收集、数据分析和设计工作&#xff0c;而AI工具能够帮助提升效率&#xff0c;减少重复劳动。 本文将介绍如何使用…

【Linux系统】—— 调试器 gdb/cgdb的使用

【Linux系统】—— 调试器 gdb/cgdb的使用 1 前置准备2 快速认识 gdb3 cgdb/gdb 的使用3.1 简单认识 cgdb3.2 打断点 / 删断点3.3 逐过程 / 逐语句3.4 查看变量3.5 快速跳转 4 cgdb/gdb 调试技巧4.1 watch4.2 「set var」确定问题原因4.3 条件断点 5 概念理解6 gdb/cgdb 指令一…

Wireshark 输出 数据包列表本身的值

在 Wireshark 中&#xff0c;如果你想输出数据包列表本身的值&#xff08;例如&#xff0c;将数据包的摘要信息、时间戳、源地址、目的地址等导出为文本格式&#xff09;&#xff0c;可以使用 导出为纯文本文件 的功能。以下是详细步骤&#xff1a; 步骤 1&#xff1a;打开 Wir…

docker部署单机版doris,完整无坑

文章目录 一、部署1、修改内核参数2、下载Docker 开发环境镜像3、下载安装包4、启动镜像5、配置fe6、配置be7、远程连接 二、运维命令参考资料 一、部署 1、修改内核参数 在启动doris的be时&#xff0c;需要将 Linux 操作系统的内核参数设置为2000000&#xff0c;这里是Doris…

STM32 低功耗模式

目录 背景 低功耗模式 睡眠模式 进入睡眠模式 退出睡眠模式 停止模式 进入停止模式 退出停止模式 待机模式 进入待机模式 退出待机模式 程序 睡眠模式 休眠模式配置 进入休眠模式 退出睡眠模式 停止模式 停止模式配置 进入停止模式 退出停止模式 待机模式…

网络安全架构战略 网络安全体系结构

本节书摘来自异步社区《网络安全体系结构》一书中的第1章&#xff0c;第1.4节&#xff0c;作者【美】Sean Convery 1.4 一切皆为目标 网络安全体系结构 当前的大型网络存在着惊人的相互依赖性&#xff0c;作为一名网络安全设计师&#xff0c;对这一点必须心知肚明。Internet就…

【算法】回溯算法

回溯算法 什么是回溯 人生无时不在选择。在选择的路口&#xff0c;你该如何抉择 ..... 回溯&#xff1a; 是一种选优搜索法&#xff0c;又称为试探法&#xff0c;按选优条件向前搜索&#xff0c;以达到目标。但当探索到某一步时&#xff0c;发现原先选择并不优或达不到目标&am…

Centos安装php-8.0.24.tar

查看系统环境 cat /etc/redhat-release 预先安装必要的依赖 yum install -y \ wget \ gcc \ gcc-c \ autoconf \ automake \ libtool \ make \ libxml2 \ libxml2-devel \ openssl \ openssl-devel \ sqlite-devel yum update 1、下载解压 cd /data/ wget https:/…

机器学习(李宏毅)——RNN

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记&#xff0c;感谢台湾大学李宏毅教授的课程&#xff0c;respect&#xff01;&#xff01;&#xff01; 二、大纲 引例RNN历史基本思想RNN变形RNN训练 三、引例 学习RNN之前先看一个例子&#xff1a; 假设要做一…

Linux 文件系统inode软硬链接

目录 一、理解文件系统 1、前言 2、磁盘 二、inode 1、创建一个新文件的 4 个操作 三、软硬链接 1、软链接 2、硬链接 3、硬链接的应用 4、软链接的应用 一、理解文件系统 1、前言 在我们电脑文件里&#xff0c;分为打开的文件和未打开的文件&#xff0c;我们在上…

多目标粒子群优化算法-MOPSO-(机器人路径规划/多目标信号处理(图像/音频))

具体完整算法请跳转&#xff1a;多目标粒子群优化算法-MOPSO-&#xff08;机器人路径规划/多目标信号处理&#xff08;图像/音频&#xff09;&#xff09; 多目标粒子群优化算法&#xff08;Multi-Objective Particle Swarm Optimization&#xff0c;MOPSO&#xff09;是一种基…

Unity合批处理优化内存序列帧播放动画

Unity合批处理序列帧优化内存 介绍图片导入到Unity中的处理Unity中图片设置处理Unity中图片裁剪 创建序列帧动画总结 介绍 这里是针对Unity序列帧动画的优化内容&#xff0c;将多个图片合批处理然后为了降低Unity的内存占用&#xff0c;但是相对的质量也会稍微降低。可自行进行…

DAY07 Collection、Iterator、泛型、数据结构

学习目标 能够说出集合与数组的区别数组:1.是引用数据类型的一种2.可以存储多个元素3.数组的长度是固定的 int[] arr1 new int[10]; int[] arr2 {1,2,3};4.数组即可以存储基本类型的数据,又可以存储引用数据类型的数据int[],double[],String[],Student[]集合:1.是引用数据类…

k8s集群如何赋权普通用户仅管理指定命名空间资源

文章目录 1. 普通用户2. 创建私钥3. 创建 CertificateSigningRequest4. 批准 CertificateSigningRequest5. 创建 kubeconfig6. 创建角色和角色绑定7. 测试 1. 普通用户 创建用户demo useradd demo2. 创建私钥 下面的脚本展示了如何生成 PKI 私钥和 CSR。 设置 CSR 的 CN 和 …

DeepSeek与ChatGPT的全面对比

在人工智能&#xff08;AI&#xff09;领域&#xff0c;生成式预训练模型&#xff08;GPT&#xff09;已成为推动技术革新的核心力量。OpenAI的ChatGPT自发布以来&#xff0c;凭借其卓越的自然语言处理能力&#xff0c;迅速占据市场主导地位。然而&#xff0c;近期中国AI初创公…

超全Deepseek资料包,deepseek下载安装部署提示词及本地部署指南介绍

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

DeepSeek24小时写作机器人,持续创作高质量文案

内容创作已成为企业、自媒体和创作者的核心竞争力。面对海量的内容需求&#xff0c;人工创作效率低、成本高、质量参差不齐等问题日益凸显。如何在有限时间内产出高质量内容&#xff1f;DeepSeek写作机器人&#xff0c;一款24小时持续创作的智能工具&#xff0c;为企业和个人提…

用deepseek学大模型08-卷积神经网络(CNN)

yuanbao.tencent.com 从入门到精通卷积神经网络(CNN),着重介绍的目标函数&#xff0c;损失函数&#xff0c;梯度下降 标量和矩阵形式的数学推导&#xff0c;pytorch真实能跑的代码案例以及模型,数据&#xff0c;预测结果的可视化展示&#xff0c; 模型应用场景和优缺点&#xf…