速率限制的基礎知識:它是如何運作的以及如何使用它
速率限制是網路開發中的重要概念。確保伺服器穩定性、資源有效率分配、防範惡意攻擊。因此,在本文中,我們將深入探討速率限制的本質、重要性、各種實作方法以及實際範例來展示其功能。讓我們開始吧?
什麼是速率限制?
速率限制是一種用於控制 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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。
