当前位置: 首页 > news >正文

SpringCloud GateWay实现路由限流

目录

    • RequestRateLimiterGatewayFilterFactory
    • 令牌桶算法
    • 实现限流

RequestRateLimiterGatewayFilterFactory

Spring Cloud Gateway 内置了一个限流功能的过滤器工厂,那就是RequestRateLimiterGatewayFilterFactory ,它使用 Redis 和 Lua 脚本实现令牌桶算法的方式进行限流,允许你根据不同的规则(如 IP、URL、参数等)来限制请求的频率,可以根据访问速率和令牌桶容量来限制路由的访问。

令牌桶算法

令牌桶算法是一种常用的流量控制算法,常用于限制对某个资源或服务的并发访问数或请求速率。该算法基于一个固定容量的令牌桶,每个请求需要消耗一个令牌才能被处理,当令牌桶为空时,则拒绝请求或将请求放入等待队列中。同时,令牌桶会以一定的速率生成令牌。

令牌桶算法的实现通常涉及两个参数:令牌生成速率和令牌桶容量。令牌生成速率指的是每秒钟向令牌桶中添加的令牌数量,令牌桶容量指的是令牌桶最多能存储的令牌数量。

例如,如果令牌生成速率为10,令牌桶容量为20,如果令牌桶为空时,则每秒钟最多可以处理10个请求,当令牌桶满的时候,则每秒可以额外处理多20个请求。

令牌桶算法优点

  1. 平滑限流:令牌桶算法可以平滑地限制流量,避免突发限流的情况。它能够在一段时间内平均处理请求流量,而不是对每个请求进行严格限制。

  2. 适应突发流量:令牌桶算法能够适应突发流量的情况,例如在互联网应用中常见的用户突然涌入的情况。由于令牌桶可以存储一定数量的令牌,因此可以应对短时间内的流量激增,而不会导致流量瓶颈或系统过载。

  3. 可配置性:令牌桶算法的参数(如令牌生成速率、令牌桶容量等)可以根据实际需求进行调整,以满足不同的限流需求。这种可配置性使得令牌桶算法具有很大的灵活性。

实现限流

1、配置Redis:
因为RequestRateLimiter过滤器是基于 Redis 的,所以我们首先需要添加对应的redis依赖和在Spring Boot的配置文件中,配置Redis连接信息。

依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

配置文件:

spring:redis:host: localhostport: 6379

2、配置限流过滤器: 在Spring Cloud Gateway的配置文件中,为需要进行限流的路由配置限流过滤器。例如:

spring:cloud:gateway:routes:- id: my_routeuri: http://example.compredicates:- Path=/my_route/**filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenish-rate: 10redis-rate-limiter.burst-capacity: 20key-resolver: "#{@remoteAddrKeyResolver}"

上述配置中,my_route是需要进行限流的路由配置,RequestRateLimiter是使用RequestRateLimiterGatewayFilterFactory实现限流的过滤器。redis-rate-limiter.replenish-rate参数指定了每秒钟生成的令牌数,redis-rate-limiter.burst-capacity参数指定了令牌桶的容量。

key-resolver:用于获取限流维度的实现类,可以根据ip、uri、设备号、用户id等进行限流,这里的remoteAddrKeyResolver是一个自定义的KeyResolver实现类,用于根据请求的远程地址来生成限流的Key。

3、实现KeyResolver: 创建自定义的KeyResolver实现类

限流的过滤器需要根据一定的规则来确定流量的标识,通过实现KeyResolver接口可以定义我们的流量维度

下面就是根据请求的远程地址来生成限流的Key

@Component("remoteAddrKeyResolver")
public class RemoteAddrKeyResolver implements KeyResolver {@Overridepublic Mono<String> resolve(ServerWebExchange exchange) {return Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());}
}

注:bean名需要与我们配置文件使用的key-resolver名称一致

以上步骤完成后,RequestRateLimiterGatewayFilterFactory就会自动根据规则生成限流的Key,并根据配置的令牌桶容量和每秒钟生成的令牌数来限制路由访问速率。

相关文章:

SpringCloud GateWay实现路由限流

目录 RequestRateLimiterGatewayFilterFactory令牌桶算法实现限流 RequestRateLimiterGatewayFilterFactory Spring Cloud Gateway 内置了一个限流功能的过滤器工厂&#xff0c;那就是RequestRateLimiterGatewayFilterFactory &#xff0c;它使用 Redis 和 Lua 脚本实现令牌桶…...

打印日期c++

给出年份 y和一年中的第 d天&#xff0c;算出第 d天是几月几号。 输入格式 输入包含多组测试数据。 每组数据占一行&#xff0c;包含两个整数 y 和 d。 输出格式 每组数据输出一行一个结果&#xff0c;格式为 yyyy-mm-dd。 数据范围 输入最多包含 100 组数据, 1≤y≤3000, 1≤d…...

数据结构入门到入土——链表(1)

目录 一&#xff0c;顺序表表/ArrayList的缺陷 二&#xff0c;链表 三&#xff0c;链表的实现 四&#xff0c;与链表有关的题目练习&#xff08;1&#xff09; 1.删除链表中等于给定值 val 的所有节点 2.反转一个单链表 3.给定一个带有头结点 head 的非空单链表&#xf…...

MySQL C API的使用

MySQL C API的使用 介绍及使用 MySQL C API&#xff08;也称为 MySQL Connector/C&#xff09;是用于与 MySQL 数据库交互的 C 语言 API。它提供了一组函数和结构体&#xff0c;允许你在 C 程序中连接到 MySQL 数据库服务器&#xff0c;并执行查询、插入、更新等数据库操作。…...

JavaScript防御性编程

简单聊一下防御性编程&#xff0c;初衷是开发人员为了防止自己被裁员&#xff0c;而将代码编写为只有自己能看懂。如何只有自己能看懂&#xff1f;方法多种多样&#xff0c;但不能将简单问题复杂化&#xff0c;比如&#xff1a;编写一堆无效的逻辑关系&#xff0c;或将业务复杂…...

微信预约小程序制作指南:从小白到专家

在当今的数字时代&#xff0c;微信小程序已经成为了一种非常流行的应用方式。预约功能更是成为了许多小程序的核心功能之一。如果你也想为你的小程序添加预约功能&#xff0c;以下步骤将会对你有所帮助。 一、进入乔拓云网后台 乔拓云网是一个在线小程序开发平台&#xff0c;你…...

向量数据库:Milvus

特性 Milvus由Go(63.4%),Python(17.0%),C(16.6%),Shell(1.3%)等语言开发开发&#xff0c;支持python&#xff0c;go&#xff0c;java接口(C,Rust,c#等语言还在开发中)&#xff0c;支持单机、集群部署&#xff0c;支持CPU、GPU运算。Milvus 中的所有搜索和查询操作都在内存中执行…...

亚马逊国际商品详情 API:获取特定商品详细信息的实践

随着电子商务的飞速发展&#xff0c;亚马逊作为全球最大的在线零售商之一&#xff0c;提供了丰富的商品详情 API&#xff0c;使得第三方开发者能够轻松地获取亚马逊网站上的商品信息。本文将介绍如何使用亚马逊国际商品详情 API&#xff08;Amazon Product Advertising API&…...

MSB30M-ASEMI小贴片整流桥MSB30M

编辑&#xff1a;ll MSB30M-ASEMI小贴片整流桥MSB30M 型号&#xff1a;MSB30M 品牌&#xff1a;ASEMI 封装&#xff1a;UMSB-4 最大平均正向电流&#xff1a;3A 最大重复峰值反向电压&#xff1a;1000V 产品引线数量&#xff1a;4 产品内部芯片个数&#xff1a;4 产品…...

Redis启动方式

redis三种启动方式 1.直接启动 进入redis根目录&#xff0c;执行命令: #加上‘&’号使redis以后台程序方式运行 ./redis-server & 2.通过指定配置文件启动 可以为redis服务启动指定配置文件&#xff0c;例如配置为/etc/redis/6379.conf 进入redis根目录&#x…...

TEMU 新手小白必看!2024入驻流程/入驻类目/入驻资料等详细流程讲解

2023 TEMU 可谓是赚足眼球&#xff0c;流量持续上涨&#xff0c;2024年相信不少卖家们已经跃跃欲试&#xff0c;但大陆卖家如何入驻TEMU&#xff1f;哪些品类适合入驻&#xff1f;又有哪些入驻要求和资料&#xff1f;别急&#xff0c;今天东哥就一一给大家详细讲解&#xff0c;…...

【C语言】数组

一维数组的创建和初始化 数组是一组相同类型元素的集合。 数组的创建 //数组的创建方式&#xff1a;type_t arr_name [const_n];//type_t 是指数组的元素类型//const_n 是一个常量表达式&#xff0c;用来指定数组的大小数组创建的实例&#xff1a; 数组创建&#xff…...

常见测试技术都有哪些?

测试技术是用于评估系统或组件的方法&#xff0c;目的是发现它是否满足给定的要求。系统测试有助于识别缺口、错误&#xff0c;或与实际需求不同的任何类型的缺失需求。测试技术是测试团队根据给定的需求评估已开发软件所使用的最佳实践。这些技术可以确保产品或软件的整体质量…...

Spring事务控制

1.事务介绍 1.1什么是事务&#xff1f; 当你需要一次执行多条SQL语句时&#xff0c;可以使用事务。通俗一点说&#xff0c;如果这几条SQL语句全部执行成功&#xff0c;则才对数据库进行一次更新&#xff0c;如果有一条SQL语句执行失败&#xff0c;则这几条SQL语句全部不进行执…...

swaggerUI不好用,试试这个openapiUI?

title: swaggerUI不好用&#xff0c;试试这个openapiUI? date: 2024-01-08 categories: [tool] tags: [openapi,工具] description: 基于swaggger2, openapi3规范的UI文档 1.背景 由于长期使用 swaggerUI 工具&#xff0c;它的轻量风格个人觉得还是不错的&#xff0c;但是它…...

嵌入式物联网项目开发实战例程-STM32F103系列之外围器件代码

开发STM32F103很好的参考例程&#xff0c;轻松实现各类外围器件的开发。持续更新中&#xff0c;欢迎关注及收藏。 0001基于STM32F103单片机GPIO实现控制LED灯闪烁的程序代码.zip 0002基于STM32F103单片机GPIO实现按键KEY的检测程序代码.zip 0003基于STM32F103单片机GPIO实现外部…...

Docker Compose--部署SpringBoot项目--实战

原文网址&#xff1a;Docker Compose--部署SpringBoot项目--实战-CSDN博客 简介 本文用实战介绍Docker Compose部署SpringBoot项目。 ----------------------------------------------------------------------------------------------- 分享Java真实高频面试题&#xff0c…...

单电阻FOC算法实现永磁同步电机的调整步骤和设置

本文档介绍了使用 单电阻FOC 算法实现永磁同步电机&#xff08;Permanent Magnet Synchronous Motor&#xff0c;PMSM&#xff09;调整所需的步骤和设置。由于不同电机存在参数差异&#xff0c;因此需针对不同的电机和负载对该算法进行调整。该电机库已经在在落地扇和空净等风机…...

化学DS-1040 Tosylate 抑制剂 1335138-89-0科研用途

化合物1219962-49-8是一种小分子化合物&#xff0c;分子式为C15H25N3O4&#xff0c;相对分子质量为305.37。该化合物为白色至灰白色粉末&#xff0c;不溶于水&#xff0c;易溶于有机溶剂&#xff0c;如甲醇、乙醇等。 AT791是一种与细胞周期调控相关的蛋白激酶&#xff0c;参与…...

PaddlePaddle初使用

模型导出与预测 # -c 后面设置训练算法的yml配置文件 # -o 配置可选参数 # Global.pretrained_model 参数设置待转换的训练模型地址&#xff0c;不用添加文件后缀 .pdmodel&#xff0c;.pdopt或.pdparams。 # Global.save_inference_dir参数设置转换的模型将保存的地址。pytho…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...