現代 Web 應用程式嚴重依賴 API,但這種能力需要強大的保護措施。 速率限制是在定義的時間範圍內控制客戶端 API 請求頻率的關鍵策略,對於維護 API 穩定性、安全性和可擴展性至關重要。
本文利用流行的工具和框架探討了 Node.js 環境中的高階速率限制技術和最佳實踐。
速率限制可透過以下方式保護您的 API 免遭誤用、拒絕服務 (DoS) 攻擊和意外過載:
讓我們研究一下有效 Node.js 實作的高階方法。
我們先建立一個基本的 Express API:
<code class="language-javascript">const express = require('express'); const app = express(); app.get('/api', (req, res) => { res.send('Welcome!'); }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => console.log(`Server running on port ${PORT}`));</code>
這構成了應用速率限制機制的基礎。
express-rate-limit
express-rate-limit
套件簡化了速率限制的實現:
<code class="language-bash">npm install express-rate-limit</code>
配置:
<code class="language-javascript">const rateLimit = require('express-rate-limit'); const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 minutes max: 100, // 100 requests per IP per window message: 'Too many requests. Please try again later.' }); app.use('/api', limiter);</code>
為了解決這些限制,讓我們來探索更進階的方法。
記憶體中的速率限制不足以支援多伺服器 API 部署。 Redis 是一種高效能記憶體資料存儲,為分散式速率限制提供了可擴展的解決方案。
<code class="language-bash">npm install redis rate-limiter-flexible</code>
<code class="language-javascript">const { RateLimiterRedis } = require('rate-limiter-flexible'); const Redis = require('ioredis'); const redisClient = new Redis(); const rateLimiter = new RateLimiterRedis({ storeClient: redisClient, keyPrefix: 'middleware', points: 100, // Requests duration: 60, // 60 seconds blockDuration: 300, // 5-minute block after limit }); app.use(async (req, res, next) => { try { await rateLimiter.consume(req.ip); next(); } catch (err) { res.status(429).send('Too many requests.'); } });</code>
API 閘道(例如 AWS API Gateway、Kong、NGINX)提供基礎架構層級的速率限制:
AWS API 閘道範例:
令牌桶演算法提供了一種靈活且高效的方法,允許流量突發,同時保持平均請求限制。
<code class="language-javascript">const express = require('express'); const app = express(); app.get('/api', (req, res) => { res.send('Welcome!'); }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => console.log(`Server running on port ${PORT}`));</code>
有效的速率限制需要強大的監控。 Datadog 或 Prometheus 等工具追蹤:
Strategy | Latency Overhead | Complexity | Scalability |
---|---|---|---|
In-Memory | Low | Simple | Limited |
Redis-Based | Moderate | Moderate | High |
API Gateway | Minimal | Complex | Very High |
有效的 API 速率限制對於維護 Node.js 應用程式的效能、安全性和可靠性至關重要。 透過利用 Redis 等工具、實作複雜的演算法並採用徹底的監控,您可以建立可擴展且有彈性的 API。
以上是Node.js 中的 API 速率限制:策略和最佳實踐的詳細內容。更多資訊請關注PHP中文網其他相關文章!