中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Node和Redis怎么限制API速率

發布時間:2021-07-21 09:32:05 來源:億速云 閱讀:159 作者:Leah 欄目:web開發

這篇文章將為大家詳細講解有關使用Node和Redis怎么限制API速率,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

為什么要速率限制?

當你考慮限制你自己的基于API的服務時,你需要在用戶體驗、安全性和性能之間進行權衡。

使用Node和Redis怎么限制API速率

控制數據流的最常見原因是保持基于API的服務的可用性。但也有安全方面的好處,一次無意或有意的入站流量激增,就會占用寶貴的資源,影響其他用戶的可用性。

通過控制傳入請求的速率,你可以:

  • 保障服務和資源不被“淹沒”。

  • 緩和暴力攻擊

  • 防止分布式拒絕服務(DDOS)攻擊

如何實施限速?

速率限制可以在客戶端級別,應用程序級別,基礎架構級別或介于兩者之間的任何位置實現。有幾種方法可以控制API服務的入站流量:

  • 按用戶:跟蹤用戶使用API密鑰、訪問令牌或IP地址進行的調用

  • 按地理區域劃分:例如降低每個地理區域在一天的高峰時段的速率限制

  • 服務器:如果你有多個服務器處理對API的不同調用,你可能會對訪問更昂貴的資源實施更嚴格的速率限制。

你可以使用這些速率限制中的任何一種(甚至組合使用)。

使用Node和Redis怎么限制API速率 

無論你選擇如何實現,速率限制的目標都是建立一個檢查點,該檢查點拒絕或通過訪問你的資源的請求。許多編程語言和框架都有實現這一點的內置功能或中間件,還有各種速率限制算法的選項。

這是使用Node和Redis制作自己的速率限制器的一種方法:

  • 創建一個Node應用

  • 使用Redis添加速率限制器

  • 在Postman中測試

在開始之前,請確保已在計算機上安裝了Node和Redis。

步驟1:建立Node應用程序

從命令行設置一個新的Node應用。通過CLI提示,或添加 —yes 標志來接受默認選項。

$ npm init --yes

如果在項目設置過程中接受了默認選項,則為入口點創建一個名為 index.js 的文件。

$ touch index.js

安裝Express Web框架,然后在 index.js 中初始化服務器。

const express = require('express') const app = express() const port = process.env.PORT || 3000 app.get('/', (req, res) => res.send('Hello World!')) app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))

從命令行啟動服務器。

$ node index.js

回到 index.js 中,創建一個路由,先檢查速率限制,如果用戶沒有超過限制再允許訪問資源。

app.post('/', async (req, res) => {   async function isOverLimit(ip) {     // to define   }   // 檢查率限制   let overLimit = await isOverLimit(req.ip)   if (overLimit) {     res.status(429).send('Too many requests - try again later')     return   }   // 允許訪問資源   res.send("Accessed the precious resources!") })

使用Node和Redis怎么限制API速率

應用級速率限制

在下一步中,我們將定義速率限制器函數 isOverLimit。

步驟2:使用Redis添加速率限制器

Redis是一個內存中鍵值數據庫,因此它可以非常快速地檢索數據。使用Redis實施速率限制也非常簡單。

  • 存儲一個像用戶IP地址一樣的key。

  • 增加從該IP發出的調用數量

  • 在指定時間段后使記錄過期

下圖所示的限速算法是一個滑動窗口計數器的例子。一個用戶如果提交的調用數量適中,或者隨著時間的推移將它們分隔開,就永遠不會達到速率限制。超過10秒窗口內最大請求的用戶必須等待足夠的時間來恢復其請求。

使用Node和Redis怎么限制API速率限速算法:滑動窗口計數器

從命令行為Node安裝一個名為ioredis的Redis客戶端。

$ npm install ioredis

在本地啟動Redis服務器。

$ redis-server

然后在 index.js 中要求并初始化Redis客戶端。

const redis = require('ioredis') const client = redis.createClient({   port: process.env.REDIS_PORT || 6379,   host: process.env.REDIS_HOST || 'localhost', })client.on('connect', function () {   console.log('connected'); });

定義我們上一步開始寫的isOverLimit函數,按照Redis的這個模式,按照IP來保存一個計數器。

async function isOverLimit(ip) {   let res   try {     res = await client.incr(ip)   } catch (err) {     console.error('isOverLimit: could not increment key')     throw err   }  console.log(`${ip} has value: ${res}`)   if (res > 10) {     return true   }  client.expire(ip, 10) }

這就是速率限制器。

當用戶調用API時,我們會檢查Redis以查看該用戶是否超出限制。如果是這樣,API將立即返回HTTP 429狀態代碼,并顯示消息 Too many  requests — try again later  。如果用戶在限制之內,我們將繼續執行下一個代碼塊,在該代碼塊中,我們可以允許訪問受保護的資源(例如數據庫)。

在進行速率限制檢查期間,我們在Redis中找到用戶的記錄,并增加其請求計數,如果Redis中沒有該用戶的記錄,那么我們將創建一個新記錄。最后,每條記錄將在最近一次活動的10秒內過期。

在下一步中,請確保我們的限速器正常運行。

步驟3:在Postman中進行測試

保存更改,然后重新啟動服務器。我們將使用Postman將 POST 請求發送到我們的API服務器,該服務器在本地運行,網址為 http://  localhost:3000。

使用Node和Redis怎么限制API速率在速率限制內

繼續快速連續發送請求以達到你的速率限制。

使用Node和Redis怎么限制API速率

 超過速率限制-HTTP 429請求過多

關于限速的最終想法

這是Node和Redis的速率限制器的簡單示例,這只是開始。有一堆策略和工具可以用來架構和實現你的速率限制。而且還有其他的增強功能可以通過這個例子來探索,比如:

  • 在響應正文或作為 Retry-after 標頭中,讓用戶知道在重試之前應該等待多少時間

  • 記錄達到速率限制的請求,以了解用戶行為并警告惡意攻擊

  • 嘗試使用其他速率限制算法或其他中間件

請記住,當你研究API限制時,你是在性能、安全性和用戶體驗之間進行權衡。你理想的速率限制解決方案將隨著時間的推移而改變,同時也會考慮到這些因素。

關于使用Node和Redis怎么限制API速率就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永州市| 乡城县| 天津市| 萝北县| 昔阳县| 天峻县| 洛宁县| 南陵县| 自治县| 将乐县| 六盘水市| 利辛县| 常德市| 佳木斯市| 札达县| 慈溪市| 淳安县| 安义县| 孟州市| 巨野县| 宣恩县| 来凤县| 太湖县| 沁源县| 东乡| 松潘县| 富顺县| 汕尾市| 新乡市| 将乐县| 仁布县| 滕州市| 乌兰浩特市| 旺苍县| 兴城市| 潞西市| 庆安县| 丹巴县| 津南区| 南安市| 浦北县|