速率限制是网络开发中的一个重要概念。确保服务器稳定性、资源高效分配、防范恶意攻击。因此,在本文中,我们将深入探讨速率限制的本质、重要性、各种实现方法以及实际示例来演示其功能。让我们开始吧?
什么是速率限制?
速率限制是一种用于控制 Web 服务或服务器的传入请求或流量的策略。它有助于保护您的应用程序免受滥用,确保公平的资源分配并保持服务稳定性。
为什么要使用速率限制?
以下是您应该使用速率限制的一些原因??
- 防止滥用:阻止机器人或恶意用户用请求淹没服务器。
- 资源管理:确保所有用户公平使用资源。
- 安全性:通过限制应用程序中某些端点的尝试来帮助防止暴力攻击。
- 成本控制:有助于防止因过多的 API 调用而产生意外费用。
- 性能:保持服务器响应并降低停机风险。
速率限制的类型
- 固定窗口(或简单)速率限制:此方法限制固定时间窗口内的请求。例如,“每分钟 100 个请求。”
- 滑动窗口速率限制:动态时间范围,用于跟踪和限制最近一段时间(例如最后几分钟或几秒钟)的请求。
- 令牌桶算法:该方法使用一个装满令牌的“桶”来管理请求。每个传入请求都会消耗一个令牌,并且桶会按照设定的时间间隔重新填充。这种方法允许流量突发,同时保持总体速率限制。
- 漏桶算法:与令牌桶类似,但有所不同。当桶满时,多余的请求会“泄漏”或被丢弃,从而保持稳定的流量。
? 我什至不想撒谎,因为我对令牌桶和漏桶算法了解不多,因为我当前的项目不需要它们。但是,固定窗口和滑动窗口是您会遇到的最常见的类型。例如,OpenAI 的 GPT-4 使用带有分层限制的固定窗口速率限制 - 第一层允许每分钟 500 个请求。这种方法可能会导致流量激增,因为用户可能会在窗口重置之前达到限制。
速率限制的工作原理
该过程通常涉及:
- 跟踪:监控用户(主要是userId)或IP在特定时间范围内发出了多少个请求。
- 阈值:定义限制(例如每小时 100 个请求)。
- 响应:超出限制时发送警告或阻止进一步的请求(通常带有 429 Too Many Requests HTTP 状态代码)。
实施速率限制:实例
现在您已经对速率限制及其工作原理有了基本的了解,让我们在我们将要创建的项目中实际实现它。
我们将创建两个项目来演示速率限制:
- GET 请求示例
- POST 请求示例
技术堆栈
- 前端:React(使用Vite)
- 后端:Express(Node.js 框架)
GET 请求示例
使用您选择的任何名称创建一个文件夹,然后在 VS code 或您使用的任何代码编辑器上打开它。
在您创建的文件夹中,再创建两个文件夹,分别称为 frontend 和 backend。
之后,cd 进入后端文件夹并输入此命令 npm init -y 来初始化 package.json 文件
之后在后端文件夹中安装以下 npm 包??
npm install express cors express-rate-limit npm install -D nodemon
它们的作用:
- Express:创建您的 Web 服务器并处理 API 路由
- cors:允许前端与后端安全通信
- express-rate-limit:保护您的 API 免受过多请求
- nodemon:在开发过程中自动重启服务器(这就是我们使用 D 的原因)
之后,创建一个index.js(您可以随意创建)文件,因为我们将使用它来设置速率限制器。
完成复制并粘贴此代码后,我将稍后解释
const express = require("express"); const rateLimit = require("express-rate-limit"); const app = express(); // Set up rate limiter: 100 requests per 15 minutes const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 minutes max: 5, // Limit each IP to 5 requests per `window` (here, per 15 minutes) message: "Too many requests from this IP, please try again later.", }); // Apply the rate limiting middleware to all requests app.use(limiter); app.get("/api/data", (req, res) => { res.send("Welcome to the API!"); }); app.listen(5000, () => { console.log("Server running on http://localhost:5000"); });
以下是每个部分的作用:
- 前两行导入我们需要的包
- app = express() 创建我们的服务器
- 限制器配置为:
- windowMs:设置15分钟的时间窗口(15×60×1000毫秒)
- 最大:该窗口中每个 IP 地址允许 5 个请求
- message:用户超出限制时看到的错误消息
然后:
- app.use(limiter) 将我们的速率限制应用于所有路由
- 我们在“/api/data”创建一个简单的测试路由,发送欢迎消息
- 最后,我们在端口 5000 上启动服务器
当用户在 15 分钟内从同一 IP 访问您的 API 超过 100 次时,他们将收到错误消息,而不是访问 API。
现在您知道它是如何工作的,我们希望通过添加到 package.json 来启用自动重启??
{ "scripts": { "dev": "nodemon index.js" } }
这就是后端的全部内容。
是时候设置前端了。
- 打开一个新终端并 cd 进入 frontend 文件夹并运行 ??
npm install express cors express-rate-limit npm install -D nodemon
- 按照以下说明进行操作,如果您不懂 TypeScript,我建议您选择 JavaScript
- 您可以通过删除一些不需要的文件来进行一些清理。这是我的样子
- 完成后,打开 App.jsx 并粘贴我将解释的这段代码?
const express = require("express"); const rateLimit = require("express-rate-limit"); const app = express(); // Set up rate limiter: 100 requests per 15 minutes const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 minutes max: 5, // Limit each IP to 5 requests per `window` (here, per 15 minutes) message: "Too many requests from this IP, please try again later.", }); // Apply the rate limiting middleware to all requests app.use(limiter); app.get("/api/data", (req, res) => { res.send("Welcome to the API!"); }); app.listen(5000, () => { console.log("Server running on http://localhost:5000"); });
这是发生的事情:
- 我们导入 useState 来管理数据,导入 axios 来发出 API 请求
- 我们创建两个状态变量:
- 响应:存储成功的 API 响应
- error:存储任何错误消息
- fetchData 函数:
- 单击按钮时调用
- 尝试从我们的 API 获取数据
- 更新响应或错误状态
- 使用 try/catch 处理成功和错误
- 用户界面显示:
- 标题
- 触发请求的按钮
- API 响应(如果成功)
- 红色错误消息(如果请求失败) 当您在 15 分钟内点击该按钮次数过多时,由于我们的后端限制,您将看到速率限制错误消息!
这就是 GET 请求示例的全部内容。让我们继续下一个例子
POST 请求示例
对于这个示例,您可以决定注释掉第一个示例的代码并粘贴此代码??
{ "scripts": { "dev": "nodemon index.js" } }
您可以看到大部分代码与第一个示例相同,但这里只是一些关键区别??
- 添加了 bodyParser 来处理表单数据
- 创建处理表单提交的 POST 端点
也将此代码粘贴到前端
npm create vite@latest .
在这里,我们只是通过表单向服务器发出请求。让我们看看这与 GET 示例有何不同:
- 使用表单而不是单个按钮
- 使用 formData 管理表单状态
- 使用handleInputChange处理输入更改
- 使用 POST 请求而不是 GET
- 以绿色显示成功消息
该表单允许在 15 分钟内提交 5 次 - 之后,用户会看到速率限制错误消息。
结论
好了,伙计们,恭喜你读完了这篇文章?我希望您现在了解速率限制的工作原理以及为什么应该在您的项目中使用它,特别是如果您正在从事涉及资金的大型项目。如果您有任何疑问,请随时在评论中提问。编码愉快?
以上是速率限制的基础知识:它是如何工作的以及如何使用它的详细内容。更多信息请关注PHP中文网其他相关文章!

Python和JavaScript的主要区别在于类型系统和应用场景。1.Python使用动态类型,适合科学计算和数据分析。2.JavaScript采用弱类型,广泛用于前端和全栈开发。两者在异步编程和性能优化上各有优势,选择时应根据项目需求决定。

选择Python还是JavaScript取决于项目类型:1)数据科学和自动化任务选择Python;2)前端和全栈开发选择JavaScript。Python因其在数据处理和自动化方面的强大库而备受青睐,而JavaScript则因其在网页交互和全栈开发中的优势而不可或缺。

Python和JavaScript各有优势,选择取决于项目需求和个人偏好。1.Python易学,语法简洁,适用于数据科学和后端开发,但执行速度较慢。2.JavaScript在前端开发中无处不在,异步编程能力强,Node.js使其适用于全栈开发,但语法可能复杂且易出错。

javascriptisnotbuiltoncorc; saninterpretedlanguagethatrunsonenginesoftenwritteninc.1)javascriptwasdesignedAsalightweight,解释edganguageforwebbrowsers.2)Enginesevolvedfromsimpleterterterpretpreterterterpretertestojitcompilerers,典型地提示。

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。

选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。

JavaScript框架的强大之处在于简化开发、提升用户体验和应用性能。选择框架时应考虑:1.项目规模和复杂度,2.团队经验,3.生态系统和社区支持。

引言我知道你可能会觉得奇怪,JavaScript、C 和浏览器之间到底有什么关系?它们之间看似毫无关联,但实际上,它们在现代网络开发中扮演着非常重要的角色。今天我们就来深入探讨一下这三者之间的紧密联系。通过这篇文章,你将了解到JavaScript如何在浏览器中运行,C 在浏览器引擎中的作用,以及它们如何共同推动网页的渲染和交互。JavaScript与浏览器的关系我们都知道,JavaScript是前端开发的核心语言,它直接在浏览器中运行,让网页变得生动有趣。你是否曾经想过,为什么JavaScr


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能