当前位置: 首页 > 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…...

嵌入式Linux开发:手把手教你交叉编译全套WiFi工具链(iwconfig, iw, wpa_supplicant, hostapd)

嵌入式Linux WiFi工具链深度实战&#xff1a;从交叉编译到系统集成 在嵌入式Linux开发中&#xff0c;WiFi功能实现往往是最具挑战性的环节之一。不同于桌面环境&#xff0c;嵌入式设备需要从底层开始构建完整的无线网络栈&#xff0c;这涉及到多个工具的协同工作。本文将带你深…...

Mysql 8.0 密码重置新思路:当传统跳过命令失效时,如何从零重建服务与数据目录

1. 当传统密码跳过命令失效时&#xff0c;我们遇到了什么&#xff1f; 最近在帮朋友处理MySQL 8.0的密码重置问题时&#xff0c;遇到了一个棘手的情况&#xff1a;按照网上流传的经典方法mysqld --skip-grant-tables完全不起作用。更糟糕的是&#xff0c;系统里连data目录和my.…...

flux_down 下载工具使用步骤详解(附FluxDown多线程下载与磁力解析教程)

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

《线性代数思维》:以代码和案例开启线性代数实用学习之旅!

《线性代数思维》介绍《线性代数思维》以代码为先导、以案例为基础&#xff0c;介绍了线性代数中最常用的概念&#xff0c;专为那些想理解并应用这些概念&#xff0c;而非仅抽象学习的读者设计。每一章都围绕一个现实世界的问题展开&#xff0c;如模拟网络流量、仿真鸟群飞行或…...

审核员能力模型——冰山模型说人话版

&#x1f4cb; 审核概论系列 第9篇/共10篇知识和技能不等于能力。认证审核员到底需要什么能力&#xff1f;麦克利兰冰山模型告诉你&#x1f4ca; 真实场景&#xff1a;CCAA注册审核员考试通过率大约只有30%-40%。很多人专业知识学了不少&#xff0c;ISO 9001标准背得滚瓜烂熟&…...

AprilTag灵活布局实战:创建自定义标签家族的完整指南

AprilTag灵活布局实战&#xff1a;创建自定义标签家族的完整指南 【免费下载链接】apriltag AprilTag is a visual fiducial system popular for robotics research. 项目地址: https://gitcode.com/gh_mirrors/ap/apriltag AprilTag是一个在机器人研究领域广受欢迎的视…...

AI原生Next.js启动器:集成Claude与Cursor的现代前端开发模板

1. 项目概述&#xff1a;一个为AI时代开发者量身定制的Next.js启动器如果你和我一样&#xff0c;每天都在和Next.js、TypeScript、Tailwind CSS打交道&#xff0c;同时又在频繁地与Claude、Cursor、Copilot这些AI编程助手“对话”&#xff0c;那你肯定也遇到过类似的烦恼&#…...

CTFd平台自动化管理:基于MCP协议的插件开发与集成实践

1. 项目概述&#xff1a;CTFd与MCP的融合实践最近在搭建和维护CTF&#xff08;Capture The Flag&#xff0c;夺旗赛&#xff09;平台时&#xff0c;我遇到了一个挺有意思的项目&#xff1a;AaryaBhusal/ctfd-mcp。简单来说&#xff0c;这是一个为CTFd平台设计的MCP&#xff08;…...

AI编程协作实战:从提示工程到全周期开发工作流

1. 项目概述&#xff1a;从零开始的AI编程启蒙最近在GitHub上看到一个挺有意思的项目&#xff0c;叫jnMetaCode/ai-coding-101。光看名字&#xff0c;你大概能猜到它和AI编程有关&#xff0c;但“101”这个后缀又暗示着它的入门属性。作为一个在代码堆里摸爬滚打多年的老码农&a…...

VideoDownloadHelper实战指南:全网视频一键下载的高效方案

VideoDownloadHelper实战指南&#xff1a;全网视频一键下载的高效方案 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 还在为无法保存心仪的在…...