速率限制是网络开发中的一个重要概念。确保服务器稳定性、资源高效分配、防范恶意攻击。因此,在本文中,我们将深入探讨速率限制的本质、重要性、各种实现方法以及实际示例来演示其功能。让我们开始吧?
什么是速率限制?
速率限制是一种用于控制 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中文网其他相关文章!

JavaScript字符串替换方法详解及常见问题解答 本文将探讨两种在JavaScript中替换字符串字符的方法:在JavaScript代码内部替换和在网页HTML内部替换。 在JavaScript代码内部替换字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 该方法仅替换第一个匹配项。要替换所有匹配项,需使用正则表达式并添加全局标志g: str = str.replace(/fi

简单JavaScript函数用于检查日期是否有效。 function isValidDate(s) { var bits = s.split('/'); var d = new Date(bits[2] '/' bits[1] '/' bits[0]); return !!(d && (d.getMonth() 1) == bits[1] && d.getDate() == Number(bits[0])); } //测试 var

本文探讨如何使用 jQuery 获取和设置 DOM 元素的内边距和外边距值,特别是元素外边距和内边距的具体位置。虽然可以使用 CSS 设置元素的内边距和外边距,但获取准确的值可能会比较棘手。 // 设置 $("div.header").css("margin","10px"); $("div.header").css("padding","10px"); 你可能会认为这段代码很

本文探讨了十个特殊的jQuery选项卡和手风琴。 选项卡和手风琴之间的关键区别在于其内容面板的显示和隐藏方式。让我们深入研究这十个示例。 相关文章:10个jQuery选项卡插件

发现十个杰出的jQuery插件,以提升您的网站的活力和视觉吸引力!这个精选的收藏品提供了不同的功能,从图像动画到交互式画廊。让我们探索这些强大的工具: 相关文章: 1

HTTP-Console是一个节点模块,可为您提供用于执行HTTP命令的命令行接口。不管您是否针对Web服务器,Web Serv

本教程向您展示了如何将自定义的Google搜索API集成到您的博客或网站中,提供了比标准WordPress主题搜索功能更精致的搜索体验。 令人惊讶的是简单!您将能够将搜索限制为Y

当div内容超出容器元素区域时,以下jQuery代码片段可用于添加滚动条。 (无演示,请直接复制到Firebug中) //D = document //W = window //$ = jQuery var contentArea = $(this), wintop = contentArea.scrollTop(), docheight = $(D).height(), winheight = $(W).height(), divheight = $('#c


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

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

Atom编辑器mac版下载
最流行的的开源编辑器

Dreamweaver Mac版
视觉化网页开发工具

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。