【Spring Cloud】网关Gateway的请求过滤工厂RequestRateLimiterGatewayFilterFactory
概念
关于微服务网关Gateway中有几十种过滤工厂,这一篇博文记录的是关于请求限流过滤工厂,也就是标题中的RequestRateLimiterGatewayFilterFactory。这个路由过滤工厂是用来判断当前请求是否应该被处理,如果不会被处理就会返回HTTP状态码为429的code。接下来构建两个模块,其中一个是服务模块,一个是网关模块来测试关于请求过滤工厂是否生效。
服务
引入依赖
<dependencies><!-- 由于仅是测试 于是无需多引入微服务相关依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>
修改yml配置
server:port: 8081spring:application:name: cloud-demo
接口路径
@RestController
@RequestMapping("/filter")
public class RateLimiterFilterController {@GetMapping("/requestRateLimiter")public String requestRateLimiter() {return "进入了限流方法";}}
网关
引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 网关 需要注意的是网关中不要引入spring-boot-starter-web 否则启动报错 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><version>2.2.0.RELEASE</version>
</dependency>
<!-- Redis RateLimiter -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
修改yml配置
server:port: 8080spring:application:name: cloud-gatewayredis:host: IPport: 端口password: 密码cloud:gateway:routes:- id: request-rate-limiter-routeuri: http://127.0.0.1:8081predicates:- Path=/filter/requestRateLimiter/**filters:# 需要注意的是Redis要在5.x以上才会生效 并且有密码情况下需要配置正确- name: RequestRateLimiterargs:# 对应的限流路由判断key-resolver: "#{@userKeyResolver}"# 每秒生成的令牌数redis-rate-limiter.replenishRate: 2# 高并发情况下将每秒生成的令牌数增加的个数 即 replenishRate + burstCapacityredis-rate-limiter.burstCapacity: 2# 每个请求消耗的令牌个数redis-rate-limiter.requestedTokens: 2
接口
@Configuration
public class FilterConfig {@Beanpublic KeyResolver userKeyResolver() {// getFirst()是获取MultiValueMap中的第一个key中的值 因为这个MultiValueMap不会产生key冲突导致value覆盖的问题return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));}}
测试
输入:http://localhost:8080/filter/requestRateLimiter是无法访问的。因为在FilterConfig配置类中配置了userKeyResolver这个组件,所以需要在路径上添加user参数。
输入:http://localhost:8080/filter/requestRateLimiter?user=xxx可以正常访问的,但是把刷新的速率加快,直接报了以下的错误,如果没有报错也没有显示文本的,F12也可以看到路径429错误码,这就是一开始所说的请求过多此过滤工厂会报429HTTP状态码的问题。

当然,既然这个过滤工厂需要配置Redis,那么就一定会需要在Redis中存储数据。打开Redis可视化工具可以发现,因为我没有指定存储的库,所以默认在0数据库中,会被存储两个值。
一个为request_rate_limiter.(user名称).timestamp,另一个为request_rate_limiter.(user名称).tokens。这之后就是涉及到源码的阅读,本篇博文并不会介绍源码,但后续会更新自定义路由过滤工厂。


相关文章:
【Spring Cloud】网关Gateway的请求过滤工厂RequestRateLimiterGatewayFilterFactory
概念 关于微服务网关Gateway中有几十种过滤工厂,这一篇博文记录的是关于请求限流过滤工厂,也就是标题中的RequestRateLimiterGatewayFilterFactory。这个路由过滤工厂是用来判断当前请求是否应该被处理,如果不会被处理就会返回HTTP状态码为42…...
自己写spring boot starter问题总结
1. Unable to find main class 创建spring boot项目写自己的starterxi写完之后使用install出现Unable to find main class,这是因为spring boot打包需要一个启动类,按照以下写法就没事 <plugins><plugin><groupId>org.springframewo…...
vue3如何打开页面即向后端发送请求
目录 背景: 实现: 1、使用 2、案例 补充: 1、如何定义一个集合来接受后端返回的list 2、加入请求头 背景: 如果想在页面刚加载时向后端发送请求,可以使用Vue 3的生命周期钩子函数onMounted来实现 实现ÿ…...
【软考】9.2 串/数组/矩阵/广义表/树
《字符串》 一种特殊的线性表,数据元素都为字符模式匹配:寻找子串第一次在主串出现的位置 模式匹配算法 1. 暴力破解法(布鲁特-福斯算法) 主串与子串一个个匹配效率低 2. KMP算法 主串后缀和子串前缀能否找到一样的元素…...
大数据 DataX 数据同步数据分析入门
目录 一、DataX 概览 1.1 DataX 是什么 1.2 DataX 3.0 概览 设计理念 当前使用现状 二、DataX 详解 2.1 DataX 3.0 框架设计 2.2 DataX 3.0 插件体系 2.3 DataX 3.0 核心架构 2.3.1 核心模块介绍 2.3.2 DataX 调度流程 2.4 DataX 3.0 的六大核心优势 2.4.1 可靠的…...
【京东开源项目】微前端框架MicroApp 1.0正式发布
介绍 MicroApp是由京东前端团队推出的一款微前端框架,它从组件化的思维,基于类WebComponent进行微前端的渲染,旨在降低上手难度、提升工作效率。MicroApp无关技术栈,也不和业务绑定,可以用于任何前端框架。 源码地址…...
多个子div在父中垂直居中
在一个div下,有多个子div,且子div都是水平垂直居中 <template><div><div class"far"><!-- 注意需要多包裹一层 --><div><div class"son1">1</div><div class"son2">222…...
[C国演义] 第十五章
第十五章 最长湍流子数组环绕字符串中唯⼀的⼦字符串 最长湍流子数组 力扣链接 子数组 ⇒ dp[i]的含义: 以arr[i] 结尾的所有子数组中的最长湍流子数组的长度 子数组 ⇒ 状态转移方程根据 最后一个位置来划分👇👇👇 初始化: 都初始化为…...
Docker Compose和Consul
目录 Docker-compose Docker-compose 简介 YAML 文件格式及编写注意事项 Docker Compose配置常用字段 Docker Compose 常用命令 Docker Compose 文件结构 compose 部署 Docker Compose 环境安装 准备依赖文件 编写配置文件docker-compose.yml Consul consul 部署 c…...
Wireshark新手小白基础使用方法
一、针对IP抓取 1、过滤格式: (1)、ip.src eq x.x.x.x (2)、ip.dst eq x.x.x.x (3)ip.src eq x.x.x.x or ip.dst eq x.x.x.x 二、针对端口过滤 1、过滤格式: (1&a…...
互动设计:深入了解用户体验的关键
交互是人与计算机系统之间的互动过程。在计算机领域中,交互是人机交互技术的核心内容之一。交互设计是一种基于人类行为科学、心理学、人体工程学等领域的专业设计,目的是创造用户友好的、易于使用的计算机软件、网络、移动应用等。交互的本质在于用户的…...
maven的坐标元素
maven的坐标:使用三个向量在Maven仓库中唯一的定位到一个jar包 * groupId:公司或组织的ID * artifactId:一个项目或者是项目中的一个模块的ID * version:版本号 <groupId>com.gz.maven</groupId> <artifactId&…...
蓝桥杯 题库 简单 每日十题 day13
01 乘积尾零 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将 所填结果输出即可。如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零? 5650 4542 3554 473 946 4114 3871 9073 90 …...
联想G50笔记本直接使用F键功能(F1~F12)需要在BIOS设置关闭热键功能可以这样操作!
如果开启启用热键模式按F1就会出现FnF1的效果,不喜欢此方式按键的用户可以进入BIOS设置界面停用热键模式即可。 停用热键模式方法如下: 1、重新启动笔记本电脑,当笔记本电脑屏幕出现Lenovo标识的时候,立即按FnF2进入BIOS设置界面…...
C++入门(头文件,命名空间,作用域,输入输出流,引用,缺省参数,函数重载)
目录 一,头文件 二,命名空间 三,作用域 四,输入输出流 五:引用 六,缺省参数 七,函数重载 一,头文件 C的头文件与C是有差距的,C的头文件是#include<stdio.h>,而C是#inc…...
“Linux免除系统交互操作方法、expect自动化交互工具” 及 “SSH批量修改主机密码脚本”
一、Linux系统免除交互操作方法 1、EOF多文本输入 案例:为机器磁盘进行分区并实现挂载,免交互式操作,如何实现? #!/bin/bash fdisk /dev/sdb <<EOF n p 1 wq EOFmkfs.xfs /dev/sdb1 && mkdir -p /data &&am…...
三相异步电机动态数学模型及矢量控制仿真
三相异步电机动态数学模型及矢量控制仿真 本文带你一步步推倒三相异步电机动态数学模型,按基于转子磁链定向的矢量控制进行 matlab 仿真,实现较好的控制效果。 1、异步电机三相方程 2、坐标变换 3、磁链3/2变换推导 4、两相静止坐标系下的方程 5、…...
HTML5 新增表单标签
HTML5为表单添加了一些新的语义化标签,可以更好地描述表单内容和功能。下面是新增的表单标签及其功能: <datalist>标签:用于定义一个选项列表,供用户选择或输入。 <output>标签:用于显示表单提交后的结果…...
【版本控制】Git(学习笔记)
一、Git工作流程图 clone(克隆): 从远程仓库中克隆代码到本地仓库checkout (检出):从本地仓库中检出一个仓库分支然后进行修订add(添加): 在提交前先将代码提交到暂存区commit(提交&…...
C语言,求一个整数的全部素数因子
#include <stdio.h> int prime(int x)//一旦x被2到x-1的数整除,就返回0,一直不被整除,才返回1。 {int j 0;for (j 2; j < x; j){if (x % j 0){return 0;}}return 1; } int main() {int n 0;scanf("%d", &n);int i…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
