搜尋
首頁web前端js教程速率限制的基礎知識:它是如何運作的以及如何使用它

速率限制是網路開發中的重要概念。確保伺服器穩定性、資源有效率分配、防範惡意攻擊。因此,在本文中,我們將深入探討速率限制的本質、重要性、各種實作方法以及實際範例來展示其功能。讓我們開始吧?

什麼是速率限制?

速率限制是一種用於控制 Web 服務或伺服器的傳入請求或流量的策略。它有助於保護您的應用程式免受濫用,確保公平的資源分配並保持服務穩定。

為什麼要使用速率限制?

以下是您應該使用速率限制的一些原因??

  • 防止濫用:阻止機器人或惡意使用者用請求淹沒伺服器。
  • 資源管理:確保所有使用者公平使用資源。
  • 安全性:透過限制應用程式中某些端點的嘗試來幫助防止暴力攻擊。
  • 成本控制:有助於防止因過多的 API 呼叫而產生意外費用。
  • 效能:保持伺服器回應並降低停機風險。

速率限制的類型

  1. 固定視窗(或簡單)速率限制:此方法限制固定時間視窗內的請求。例如,「每分鐘 100 個請求。」
  2. 滑動視窗速率限制:動態時間範圍,用於追蹤和限制最近一段時間(例如最後幾分鐘或幾秒鐘)的請求。
  3. 令牌桶演算法:此方法使用一個裝滿令牌的「桶」來管理請求。每個傳入請求都會消耗一個令牌,並且桶子會按照設定的時間間隔重新填充。這種方法允許流量突發,同時保持整體速率限制。
  4. 漏桶演算法:與令牌桶類似,但有所不同。當桶滿時,多餘的請求會「洩漏」或被丟棄,從而保持穩定的流量。

我甚至不想撒謊,因為我對令牌桶和漏桶演算法了解不多,因為我目前的專案不需要它們。但是,固定視窗和滑動視窗是您會遇到的最常見的類型。例如,OpenAI 的 GPT-4 使用帶有分層限制的固定視窗速率限制 - 第一層允許每分鐘 500 個請求。這種方法可能會導致流量激增,因為使用者可能會在視窗重置之前達到限制。

速率限制的工作原理

過程通常涉及:

  1. 追蹤:監控使用者(主要是userId)或IP在特定時間範圍內發出了多少個請求。
  2. 閾值:定義限制(例如每小時 100 個請求)。
  3. 回應:超出限制時發送警告或阻止進一步的請求(通常帶有 429 Too Many Requests HTTP 狀態碼)。

實施速率限制:實例

現在您已經對速率限制及其工作原理有了基本的了解,讓我們在我們將要創建的專案中實際實現它。

我們將建立兩個項目來示範速率限制:

  1. GET 請求範例
  2. 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");
});

以下是每個部位的作用:

  1. 前兩行導入我們需要的套件
  2. app = express() 建立我們的伺服器
  3. 限制器配置為:
    • windowMs:設定15分鐘的時間視窗(15×60×1000毫秒)
    • 最大:該視窗中每個 IP 位址允許 5 個請求
    • message:使用者超出限制時看到的錯誤訊息

然後:

  1. app.use(limiter) 將我們的速率限制應用於所有路由
  2. 我們在「/api/data」建立一個簡單的測試路由,發送歡迎訊息
  3. 最後,我們在連接埠 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
  • 您可以透過刪除一些不需要的檔案來進行一些清理。這是我的樣子

The Basics of Rate Limiting: How It Works and How to Use It

  • 完成後,打開 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");
});

這是發生的事情:

  1. 我們導入 useState 來管理數據,導入 axios 來發出 API 請求
  2. 我們建立兩個狀態變數:
    • 回應:儲存成功的 API 回應
    • error:儲存任何錯誤訊息
  3. fetchData 函數:
    • 點選按鈕時呼叫
    • 嘗試從我們的 API 取得資料
    • 更新回應或錯誤狀態
    • 使用 try/catch 處理成功與錯誤
  4. 使用者介面顯示:
    • 標題
    • 觸發請求的按鈕
    • API 回應(如果成功)
    • 紅色錯誤訊息(如果請求失敗) 當您在 15 分鐘內點擊該按鈕次數過多時,由於我們的後端限制,您將看到速率限制錯誤訊息!

這就是 GET 請求範例的全部內容。讓我們繼續下一個例子

POST 請求範例

對於這個範例,您可以決定註解掉第一個範例的程式碼並貼上此程式碼??

 {
  "scripts": {
    "dev": "nodemon index.js"
  }
}

您可以看到大部分程式碼與第一個範例相同,但這裡只是一些關鍵區別??

  • 新增了 bodyParser 來處理表單資料
  • 建立處理表單提交的 POST 端點

也將此程式碼貼到前端

  npm create vite@latest .

在這裡,我們只是透過表單向伺服器發出請求。讓我們看看這與 GET 範例有何不同:

  1. 使用表單而不是單一按鈕
  2. 使用 formData 管理表單狀態
  3. 使用handleInputChange處理輸入更改
  4. 使用 POST 請求而不是 GET
  5. 以綠色顯示成功訊息

該表單允許在 15 分鐘內提交 5 次 - 之後,使用者會看到速率限制錯誤訊息。

結論

好了,夥伴們,恭喜你們讀完了這篇文章?我希望您現在了解速率限制的工作原理以及為什麼應該在您的專案中使用它,特別是如果您正在從事涉及資金的大型專案。如果您有任何疑問,請隨時在評論中提問。編碼愉快?

以上是速率限制的基礎知識:它是如何運作的以及如何使用它的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python vs. JavaScript:開發人員的比較分析Python vs. JavaScript:開發人員的比較分析May 09, 2025 am 12:22 AM

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

Python vs. JavaScript:選擇合適的工具Python vs. JavaScript:選擇合適的工具May 08, 2025 am 12:10 AM

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript:了解每個的優勢Python和JavaScript:了解每個的優勢May 06, 2025 am 12:15 AM

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

JavaScript的核心:它是在C還是C上構建的?JavaScript的核心:它是在C還是C上構建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript應用程序:從前端到後端JavaScript應用程序:從前端到後端May 04, 2025 am 12:12 AM

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

Python vs. JavaScript:您應該學到哪種語言?Python vs. JavaScript:您應該學到哪種語言?May 03, 2025 am 12:10 AM

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架:為現代網絡開發提供動力JavaScript框架:為現代網絡開發提供動力May 02, 2025 am 12:04 AM

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能