成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

通過Node和Redis進(jìn)行API速率限制

開發(fā) 前端 Redis
當(dāng)你考慮限制你自己的基于API的服務(wù)時,你需要在用戶體驗、安全性和性能之間進(jìn)行權(quán)衡。

速率限制可以保護(hù)和提高基于API的服務(wù)的可用性。如果你正在與一個API對話,并收到HTTP 429 Too Many Requests的響應(yīng)狀態(tài)碼,說明你已經(jīng)被速率限制了。這意味著你超出了給定時間內(nèi)允許的請求數(shù)量。你需要做的就是放慢腳步,稍等片刻,然后再試一次。

[[340955]]

為什么要速率限制?

當(dāng)你考慮限制你自己的基于API的服務(wù)時,你需要在用戶體驗、安全性和性能之間進(jìn)行權(quán)衡。

[[340956]]

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

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

  • 保障服務(wù)和資源不被“淹沒”。
  • 緩和暴力攻擊
  • 防止分布式拒絕服務(wù)(DDOS)攻擊

如何實施限速?

速率限制可以在客戶端級別,應(yīng)用程序級別,基礎(chǔ)架構(gòu)級別或介于兩者之間的任何位置實現(xiàn)。有幾種方法可以控制API服務(wù)的入站流量:

  • 按用戶:跟蹤用戶使用API密鑰、訪問令牌或IP地址進(jìn)行的調(diào)用
  • 按地理區(qū)域劃分:例如降低每個地理區(qū)域在一天的高峰時段的速率限制
  • 按服務(wù)器:如果你有多個服務(wù)器處理對API的不同調(diào)用,你可能會對訪問更昂貴的資源實施更嚴(yán)格的速率限制。

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

通過Node和Redis進(jìn)行API速率限制 

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

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

  • 創(chuàng)建一個Node應(yīng)用
  • 使用Redis添加速率限制器
  • 在Postman中測試

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

步驟1:建立Node應(yīng)用程序

從命令行設(shè)置一個新的Node應(yīng)用。通過CLI提示,或添加 —yes 標(biāo)志來接受默認(rèn)選項。

  1. $ npm init --yes 

如果在項目設(shè)置過程中接受了默認(rèn)選項,則為入口點創(chuàng)建一個名為 index.js 的文件。

  1. $ touch index.js 

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

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

從命令行啟動服務(wù)器。

  1. $ node index.js 

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

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

應(yīng)用級速率限制

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

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

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

  • 存儲一個像用戶IP地址一樣的key。
  • 增加從該IP發(fā)出的調(diào)用數(shù)量
  • 在指定時間段后使記錄過期

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

通過Node和Redis進(jìn)行API速率限制限速算法:滑動窗口計數(shù)器

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

  1. $ npm install ioredis 

在本地啟動Redis服務(wù)器。

  1. $ redis-server 

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

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

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

  1. async function isOverLimit(ip) { 
  2.   let res 
  3.   try { 
  4.     res = await client.incr(ip) 
  5.   } catch (err) { 
  6.     console.error('isOverLimit: could not increment key') 
  7.     throw err 
  8.   }  console.log(`${ip} has value: ${res}`) 
  9.   if (res > 10) { 
  10.     return true 
  11.   }  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中找到用戶的記錄,并增加其請求計數(shù),如果Redis中沒有該用戶的記錄,那么我們將創(chuàng)建一個新記錄。最后,每條記錄將在最近一次活動的10秒內(nèi)過期。

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

步驟3:在Postman中進(jìn)行測試

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

在速率限制內(nèi)

繼續(xù)快速連續(xù)發(fā)送請求以達(dá)到你的速率限制。

通過Node和Redis進(jìn)行API速率限制

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

關(guān)于限速的最終想法

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

  • 在響應(yīng)正文或作為 Retry-after 標(biāo)頭中,讓用戶知道在重試之前應(yīng)該等待多少時間
  • 記錄達(dá)到速率限制的請求,以了解用戶行為并警告惡意攻擊
  • 嘗試使用其他速率限制算法或其他中間件

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

 

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2020-09-14 06:45:29

RedisNodeDunizb

2024-09-23 08:03:59

2023-07-21 14:04:37

2012-03-30 15:49:26

ibmdw

2017-03-02 10:10:34

2018-02-08 08:52:37

2010-08-06 14:33:37

思科路由器端口限制

2019-08-27 08:32:01

nginx訪問頻率下載速率

2024-01-19 13:27:51

語言模型LLM

2024-09-25 08:04:58

2021-06-15 15:03:21

MongoDBNode.jsCRUD

2023-04-18 15:18:10

2023-05-26 00:21:35

FastAPI項目Python

2009-11-27 16:14:25

Cisco路由器日志

2011-03-14 16:05:55

Iptables

2019-02-12 15:39:52

2025-02-18 11:02:01

2022-05-10 08:02:05

API網(wǎng)關(guān)系統(tǒng)

2021-07-14 23:55:19

ApiNodeAddon

2016-10-27 13:46:23

AWSLambdaServerless
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产成人免费视频网站视频社区 | 一级毛片免费视频 | 久久偷人 | 欧美精品一区二区蜜桃 | 免费看a| 欧美一卡二卡在线观看 | 青青草在线视频免费观看 | 免费观看色 | 二区精品 | 国产激情一区二区三区 | 伊人免费网 | 91亚洲精选 | 成人精品一区二区三区中文字幕 | 国产99久久精品一区二区永久免费 | 国内精品视频在线观看 | 中文字幕第九页 | www.色综合 | 亚洲精品性视频 | 欧美日韩精品区 | 国产精品96久久久久久 | 逼逼网 | 成人片免费看 | 在线视频亚洲 | 久久久91精品国产一区二区三区 | 日韩中文在线 | 全免费a级毛片免费看视频免 | 99久久精品国产一区二区三区 | 中文字幕久久精品 | 久久一二 | 国产午夜精品一区二区三区嫩草 | 亚洲视频欧美视频 | 国产毛片久久久久久久久春天 | 精品无码久久久久久久动漫 | 亚洲精品久久久久久久久久久久久 | 91精品国产91久久久久久吃药 | 欧美综合国产精品久久丁香 | 中文字幕在线精品 | 日韩在线国产 | 亚洲国产精品va在线看黑人 | 国精产品一区一区三区免费完 | 国产成人在线视频免费观看 |