通過Node+Redi如何實(shí)現(xiàn)API速率限制?這個問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!
創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作與策劃設(shè)計(jì),香洲網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:香洲等地區(qū)。香洲做網(wǎng)站價(jià)格咨詢:13518219792速率限制可以保護(hù)和提高基于API的服務(wù)的可用性。如果你正在與一個API對話,并收到HTTP 429 Too Many Requests的響應(yīng)狀態(tài)碼,說明你已經(jīng)被速率限制了。
當(dāng)你考慮限制你自己的基于API的服務(wù)時,你需要在用戶體驗(yàn)、安全性和性能之間進(jìn)行權(quán)衡。
控制數(shù)據(jù)流的最常見原因是保持基于API的服務(wù)的可用性。但也有安全方面的好處,一次無意或有意的入站流量激增,就會占用寶貴的資源,影響其他用戶的可用性。
通過控制傳入請求的速率,你可以:
速率限制可以在客戶端級別,應(yīng)用程序級別,基礎(chǔ)架構(gòu)級別或介于兩者之間的任何位置實(shí)現(xiàn)。有幾種方法可以控制API服務(wù)的入站流量:
你可以使用這些速率限制中的任何一種(甚至組合使用)。
無論你選擇如何實(shí)現(xiàn),速率限制的目標(biāo)都是建立一個檢查點(diǎn),該檢查點(diǎn)拒絕或通過訪問你的資源的請求。許多編程語言和框架都有實(shí)現(xiàn)這一點(diǎn)的內(nèi)置功能或中間件,還有各種速率限制算法的選項(xiàng)。
這是使用Node和Redis制作自己的速率限制器的一種方法:
在GitHub上查看代碼示例。
在開始之前,請確保已在計(jì)算機(jī)上安裝了Node和Redis。
從命令行設(shè)置一個新的Node應(yīng)用。通過CLI提示,或添加 —yes
標(biāo)志來接受默認(rèn)選項(xiàng)。
$ npm init --yes
如果在項(xiàng)目設(shè)置過程中接受了默認(rèn)選項(xiàng),則為入口點(diǎn)創(chuàng)建一個名為 index.js
的文件。
$ touch index.js
安裝Express Web框架,然后在 index.js
中初始化服務(wù)器。
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}`))
從命令行啟動服務(wù)器。
$ node index.js
回到 index.js
中,創(chuàng)建一個路由,先檢查速率限制,如果用戶沒有超過限制再允許訪問資源。
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!") })
在下一步中,我們將定義速率限制器函數(shù) isOverLimit
。
Redis是一個內(nèi)存中鍵值數(shù)據(jù)庫,因此它可以非??焖俚貦z索數(shù)據(jù)。使用Redis實(shí)施速率限制也非常簡單。
下圖所示的限速算法是一個滑動窗口計(jì)數(shù)器的例子。一個用戶如果提交的調(diào)用數(shù)量適中,或者隨著時間的推移將它們分隔開,就永遠(yuǎn)不會達(dá)到速率限制。超過10秒窗口內(nèi)大請求的用戶必須等待足夠的時間來恢復(fù)其請求。
從命令行為Node安裝一個名為ioredis的Redis客戶端。
$ npm install ioredis
在本地啟動Redis服務(wù)器。
$ 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函數(shù),按照Redis的這個模式,按照IP來保存一個計(jì)數(shù)器。
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) }
這就是速率限制器。
當(dāng)用戶調(diào)用API時,我們會檢查Redis以查看該用戶是否超出限制。如果是這樣,API將立即返回HTTP 429狀態(tài)代碼,并顯示消息 Too many requests — try again later
。如果用戶在限制之內(nèi),我們將繼續(xù)執(zhí)行下一個代碼塊,在該代碼塊中,我們可以允許訪問受保護(hù)的資源(例如數(shù)據(jù)庫)。
在進(jìn)行速率限制檢查期間,我們在Redis中找到用戶的記錄,并增加其請求計(jì)數(shù),如果Redis中沒有該用戶的記錄,那么我們將創(chuàng)建一個新記錄。最后,每條記錄將在最近一次活動的10秒內(nèi)過期。
在下一步中,請確保我們的限速器正常運(yùn)行。
保存更改,然后重新啟動服務(wù)器。我們將使用Postman將 POST
請求發(fā)送到我們的API服務(wù)器,該服務(wù)器在本地運(yùn)行,網(wǎng)址為 http:// localhost:3000
。
繼續(xù)快速連續(xù)發(fā)送請求以達(dá)到你的速率限制。
感謝各位的閱讀!看完上述內(nèi)容,你們對通過Node+Redi如何實(shí)現(xiàn)API速率限制大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。
本文題目:通過Node+Redi如何實(shí)現(xiàn)API速率限制-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://chinadenli.net/article30/dhghpo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、網(wǎng)站排名、App開發(fā)、企業(yè)建站、網(wǎng)頁設(shè)計(jì)公司、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容