Spring Cloud Gateway实现API访问频率限制
Spring Cloud Gateway实现API访问频率限制
- 一、为什么需要访问频率限制?
- 二、使用全局过滤器实现访问频率限制
- 步骤:
- 示例代码:
- 三、使用特定路由的过滤器实现访问频率限制
- 步骤:
- 示例代码:
- 四、总结
在微服务架构中,API网关扮演着至关重要的角色,它不仅负责路由请求,还能提供诸如安全性、监控和限流等功能。Spring Cloud Gateway作为Spring Cloud生态系统中的一员,提供了强大的路由和过滤功能。本文将详细介绍如何使用Spring Cloud Gateway的全局过滤器(Global Filters)或特定路由的过滤器(Gateway Filters)来实现对外部接口的访问频率限制。
一、为什么需要访问频率限制?
访问频率限制(Rate Limiting)是保护后端服务免受恶意或异常流量攻击的重要手段。通过限制客户端在一定时间窗口内的请求次数,可以有效防止服务过载,保障系统的稳定性和可用性。
二、使用全局过滤器实现访问频率限制
全局过滤器适用于对所有路由进行统一的访问频率限制。以下是实现这一功能的详细步骤和示例代码。
步骤:
-
创建一个自定义的全局过滤器: 实现
GlobalFilter接口,并在过滤器中实现访问频率限制逻辑。 -
配置过滤器: 将自定义的全局过滤器注册到Spring Cloud Gateway中。
示例代码:
import org.springframework.cloud.gateway.filter.GatewayFilterChain;import org.springframework.cloud.gateway.filter.GlobalFilter;import org.springframework.core.Ordered;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.atomic.AtomicInteger;@Componentpublic class RateLimitGlobalFilter implements GlobalFilter, Ordered {private final ConcurrentHashMap<String, AtomicInteger> requestCounts = new ConcurrentHashMap<>();@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String ipAddress = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();AtomicInteger count = requestCounts.computeIfAbsent(ipAddress, k -> new AtomicInteger(0));if (count.incrementAndGet() > 10) { // 每秒最多10次请求exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);return exchange.getResponse().setComplete();}return chain.filter(exchange).then(Mono.fromRunnable(() -> {if (count.decrementAndGet() == 0) {requestCounts.remove(ipAddress);}}));}@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE;}}
三、使用特定路由的过滤器实现访问频率限制
特定路由的过滤器适用于对特定路由进行访问频率限制。
步骤:
-
创建一个自定义的GatewayFilter工厂: 实现
GatewayFilterFactory接口,并在工厂中实现访问频率限制逻辑。 -
配置路由过滤器: 在路由配置中使用自定义的GatewayFilter工厂。
示例代码:
import org.springframework.cloud.gateway.filter.GatewayFilter;import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import reactor.core.publisher.Mono;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.atomic.AtomicInteger;@Componentpublic class RateLimitGatewayFilterFactory extends AbstractGatewayFilterFactory<RateLimitGatewayFilterFactory.Config> {private final ConcurrentHashMap<String, AtomicInteger> requestCounts = new ConcurrentHashMap<>();public RateLimitGatewayFilterFactory() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) -> {String routeId = exchange.getRequest().getPath().toString();AtomicInteger count = requestCounts.computeIfAbsent(routeId, k -> new AtomicInteger(0));if (count.incrementAndGet() > config.getMaxRequestsPerSecond()) { // 每秒最多config.getMaxRequestsPerSecond()次请求exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);return exchange.getResponse().setComplete();}return chain.filter(exchange).then(Mono.fromRunnable(() -> {if (count.decrementAndGet() == 0) {requestCounts.remove(routeId);}}));};}public static class Config {private int maxRequestsPerSecond;public int getMaxRequestsPerSecond() {return maxRequestsPerSecond;}public void setMaxRequestsPerSecond(int maxRequestsPerSecond) {this.maxRequestsPerSecond = maxRequestsPerSecond;}}}
在application.yml中配置路由过滤器:
cloud:gateway:routes:- id: rate_limited_routeuri: http://example.compredicates:- Path=/rate_limited_pathfilters:- name: RateLimitargs:maxRequestsPerSecond: 10
四、总结
通过以上步骤和示例代码,可以在Spring Cloud Gateway中实现对外部接口的访问频率限制。根据具体需求选择使用全局过滤器或特定路由的过滤器,可以有效保护后端服务免受异常流量攻击,提升系统的稳定性和可用性。
相关文章:
Spring Cloud Gateway实现API访问频率限制
Spring Cloud Gateway实现API访问频率限制 一、为什么需要访问频率限制?二、使用全局过滤器实现访问频率限制步骤:示例代码: 三、使用特定路由的过滤器实现访问频率限制步骤:示例代码: 四、总结 在微服务架构中&#x…...
单例模式:确保唯一实例的设计模式
前言 在学习框架和大型项目开发时,我们常常会遇到“单例模式”这个词。虽然它时常被提及,但往往没有详细讲解。为了搞懂单例模式的真正意义以及它在开发中的应用,我查阅了一些资料并总结了这篇博客。希望通过这篇文章,能够帮助大…...
MCU调试技巧-串口打印
1. 软件仿真printf 条件:MDK 效果:在软件仿真模式下,调试页面的串口终端中可以看到串口打印 教程:https://blog.csdn.net/ybhuangfugui/article/details/94378195 2. 串口重定向printf 条件:物理串口接线 效果&…...
VS+Qt+C++点云PCL三维显示编辑系统
程序示例精选 VSQtC点云PCL三维显示编辑系统 如需安装运行环境或远程调试,见文章底部个人QQ名片,由专业技术人员远程协助! 前言 这篇博客针对《VSQtC点云PCL三维显示编辑系统》编写代码,代码整洁,规则,易…...
代码随想录算法训练营第七天(一)| 454.四数相加II 383. 赎金信
454.四数相加II 题目: 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1࿱…...
SpringBoot+Mybatis 分页
无论多数据源,还是单数据源,分页都一样,刚开始出了点错,是因为PageHelper的版本问题 这里用的SpringBoot3 SpringBoot2应该是没有问题的 相关代码 dynamic-datasourceMybatis多数据源使用-CSDN博客 依赖 <?xml version"1.0" encoding"UTF-8"?&g…...
学习进行到了第十七天(2024.8.5)
1.Mybatis的定义 数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中数据模型的统称。例如,文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作。MyBatis 支持定制化 SQL、存储过程以及高级映射,可以…...
【Nuxt】Layout 布局和渲染模式
NuxtLayout app.vue <NuxtLayout><NuxtPage/></NuxtLayout>然后默认的布局 需要 写在 ~/layouts/default.vue 下面,其他自定义的布局也在写在 layouts 目录下。 default.vue <template><div class"app-container"><d…...
C:指针学习(1)-学习笔记
目录 前言: 知识回顾: 1、const 1.1 const修饰普通变量 1.2 const修饰指针变量 1.3 总结: 2、指针运算 2.1 指针-整数 2.2 指针-指针 2.3 指针的关系运算 3、指针的使用 结语: 前言: 距离上一次更新关于初…...
【LVS】负载均衡之NAT模式
一、LVS概念 LVS(Linux Virtual Server)是一个基于Linux操作系统的虚拟服务器技术,用于实现负载均衡和高可用性。LVS通过将客户端的请求分发到多台后端服务器上,从而提高整体服务的处理能力和可靠性。 二、LVS优势 高性能&…...
ASP.NET Core 基础 - 入门实例
一. 下载 1. 下载vs2022 Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com) 学生,个人开发者选择社区版就行,免费的. 安装程序一直下一步下一步就行,别忘了选择安装位置,如果都放在C盘的话,就太大了. 2. 选择工作负荷 准备工作完成 二. 创建新项目 三…...
机器人主板维修|ABB机械手主板元器件故障
【ABB机器人电路板故障原因诊断】 针对上述故障现象,我们需要对ABB机器人IO板进行详细的故障诊断。以下是一些可能的故障原因: 1. 元器件老化或损坏:ABB机械手安全面板上的元器件在长期使用过程中可能出现老化、损坏或接触不良等问题…...
大数据Flink(一百零六):什么是阿里云实时计算Flink版
文章目录 什么是阿里云实时计算Flink版 一、产品概述 二、产品架构 三、产品优势 什么是阿里云实时计算Flink版 阿里云实时计算Flink版是一套基于Apache Flink构建的⼀站式实时大数据分析平台,提供端到端亚秒级实时数据分析能力,并通过标准SQL降低业…...
ERCOT中的专业术语解释
在ERCOT中,ECRSM 代表的是 “Emergency Contingency Resource Supplementary Market”。这个术语涉及到紧急备用资源市场,用于应对电力需求或供应的紧急情况。在ERCOT电网中,当系统面临极端情况或资源不足时,ECRSM 可以帮助确保电…...
Python酷库之旅-第三方库Pandas(069)
目录 一、用法精讲 276、pandas.Series.dt.is_quarter_start属性 276-1、语法 276-2、参数 276-3、功能 276-4、返回值 276-5、说明 276-6、用法 276-6-1、数据准备 276-6-2、代码示例 276-6-3、结果输出 277、pandas.Series.dt.is_quarter_end属性 277-1、语法 …...
基于hutools的国密SM2、3、4
文章目录 前言一. 代码 前言 最近还要深度研究hutools底层实现,一定要搞透澈,本章将会是持续更新 参考资料: Java代码实现SM2算法以及注意点总结(踩坑记录) 国密算法工具Smutil 一. 代码 import cn.hutool.core.uti…...
进程的等待(非阻塞轮询+阻塞)和替换控制详解
引言 在Linux系统中,进程管理是核心功能之一。理解进程的创建、执行和终止是系统编程中的基础。本文将深入探讨Linux中的进程控制机制,包括进程的生命周期、父子进程的交互、以及进程状态的管理 1. 进程创建:fork()函数 在Linux操作系统中…...
24/8/6算法笔记 支持向量机
支持向量机(Support Vector Machine, SVM)是一种监督学习算法,主要用于分类和回归任务。它基于统计学习理论中的结构风险最小化原理,通过找到数据点之间的最优边界来实现模型的泛化能力。 import numpy as np import matplotlib.…...
测试用例等级划分
基本等级(Level 1或P0):这类用例设计系统基本功能,执行失败会导致多处重要功能无法运行。例如,单表维护中的增加功能、最平常的业务使用等,这些是发生概率较高的功能用例。这类用例在每一…...
打造Perl编译器前端:自定义语言处理的魔法
打造Perl编译器前端:自定义语言处理的魔法 Perl是一种强大而灵活的编程语言,它提供了丰富的文本处理能力,使其成为实现自定义编译器前端的理想选择。编译器前端通常负责源代码的词法分析、语法分析和语义分析。本文将详细介绍如何在Perl中实…...
DataRoom大屏设计器:3分钟打造专业数据可视化看板的终极解决方案
DataRoom大屏设计器:3分钟打造专业数据可视化看板的终极解决方案 【免费下载链接】DataRoom 🔥基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的大屏设计器,具备目录管理、DashBoard设计、预览能力,支持MySQL、…...
疲劳驾驶司机异常驾驶行为检测及预警系统 1.开放全部源代码,可自行进行修改 2.提供完整程序打...
疲劳驾驶司机异常驾驶行为检测及预警系统 1.开放全部源代码,可自行进行修改 2.提供完整程序打包软件.exe,不用任何编译环境,直接点开就能运行 3.包括疲劳检测(打哈欠,低头,闭眼),人脸…...
Qwen3-14B镜像部署案例:汽车4S店智能顾问系统客户问答落地
Qwen3-14B镜像部署案例:汽车4S店智能顾问系统客户问答落地 1. 项目背景与需求分析 在汽车销售与服务行业,4S店每天需要处理大量客户咨询,包括车型参数、购车政策、维修保养等各类问题。传统客服模式面临三大痛点: 人力成本高&a…...
FLUX.1-dev旗舰版画质巅峰:多组高清AI绘画作品效果对比
FLUX.1-dev旗舰版画质巅峰:多组高清AI绘画作品效果对比 1. 光影质感革命:FLUX.1-dev的视觉突破 当第一次看到FLUX.1-dev生成的图像时,大多数人都会产生同一个疑问:这真的是AI画的吗?作为当前开源界最强的Text-to-Ima…...
基于Qt框架的桌面应用开发:集成nli-distilroberta-base实现本地文本分析工具
基于Qt框架的桌面应用开发:集成nli-distilroberta-base实现本地文本分析工具 1. 引言:当桌面应用遇上NLP模型 最近在开发一个跨平台的文本分析工具时,遇到了一个有趣的需求:如何让传统桌面应用具备自然语言理解能力?…...
OpenClaw环境隔离方案:用Docker部署Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF避免依赖冲突
OpenClaw环境隔离方案:用Docker部署Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF避免依赖冲突 1. 为什么需要Docker环境隔离 去年我在本地尝试部署OpenClaw时,最头疼的问题就是Python依赖冲突。当时为了同时运行OpenClaw和一个本地大模型…...
【Python 入门到精通】第 5 章:字典与结构化数据,从基础到实战全解析
前言在 Python 中,列表是我们最常用的线性数据结构,但它只能按顺序存储数据,无法快速通过 “名称” 查找对应的值。而字典(dict) 作为 Python 中最核心的 “键 - 值对” 数据结构,完美解决了这个问题 —— …...
云容笔谈·东方红颜影像生成系统解决403 Forbidden难题:API访问权限与安全配置详解
云容笔谈东方红颜影像生成系统解决403 Forbidden难题:API访问权限与安全配置详解 部署好一个功能强大的AI影像生成系统,比如云容笔谈东方红颜,满心欢喜准备调用时,却在浏览器或代码里看到一个冷冰冰的“403 Forbidden”错误&…...
React Express渲染模式终极指南:Render Props与自定义Hook的对比分析
React Express渲染模式终极指南:Render Props与自定义Hook的对比分析 【免费下载链接】react-express Learn React through interactive examples 项目地址: https://gitcode.com/gh_mirrors/re/react-express 想要在React中实现组件逻辑复用?Ren…...
告别“权限不足”:手把手教你用CobaltStrike的Bypass UAC功能搞定Windows提权
实战指南:利用CobaltStrike突破Windows权限限制 当你手握一个普通用户权限的Beacon会话,却卡在"请求的操作需要提升"的提示前,这种挫败感每个渗透测试员都深有体会。Windows的用户账户控制(UAC)就像一堵无形的墙,将普通…...
