hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 前端开发 - 正文 君子好学,自强不息!

经由过程Node+Redi完成API速度限定_WEB前端开发

2020-09-19前端开发搜奇网51°c
A+ A-

速度限定能够庇护和进步基于API的效劳的可用性。假如你正在与一个API对话,并收到HTTP 429 Too Many Requests的相应状况码,申明你已被速度限定了。这意味着你超越了给定时候内许可的请求数目。你须要做的就是放慢脚步,稍等片刻,然后再试一次。

视频教程引荐:nodejs 教程

为何要速度限定?

当你斟酌限定你本身的基于API的效劳时,你须要在用户体验、平安性和机能之间举行衡量。

掌握数据流的最常见原因是坚持基于API的效劳的可用性。但也有平安方面的优点,一次无意或故意的入站流量激增,就会占用珍贵的资本,影响其他用户的可用性。

经由过程掌握传入请求的速度,你能够:

  • 保证效劳和资本不被“吞没”。
  • 紧张暴力进击
  • 防备分布式谢绝效劳(DDOS)进击

怎样实行限速?

速度限定能够在客户端级别,运用程序级别,基本架构级别或介于两者之间的任何位置完成。有几种要领能够掌握API效劳的入站流量:

  • 按用户:跟踪用户运用API密钥、接见令牌或IP地点举行的挪用
  • 按地舆地区分别:比方下降每一个地舆地区在一天的岑岭时段的速度限定
  • 按效劳器:假如你有多个效劳器处置惩罚对API的差别挪用,你大概会对接见更高贵的资本实行更严厉的速度限定。

你能够运用这些速度限定中的任何一种(以至组合运用)。

不管你挑选怎样完成,速度限定的目的都是竖立一个搜检点,该搜检点谢绝或经由过程接见你的资本的请求。很多编程语言和框架都有完成这一点的内置功用或中间件,另有种种速度限定算法的选项。

这是运用Node和Redis制造本身的速度限定器的一种要领:

  • 建立一个Node运用

  • 运用Redis增添速度限定器

  • 在Postman中测试

在GitHub上检察代码示例。

在入手下手之前,请确保已在盘算机上装置了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!")
})

鄙人一步中,我们将定义速度限定器函数 isOverLimit

步骤2:运用Redis增添速度限定器

Redis是一个内存中键值数据库,因而它能够异常疾速地检索数据。运用Redis实行速度限定也异常简朴。

  • 存储一个像用户IP地点一样的key。
  • 增添从该IP发出的挪用数目
  • 在指定时候段后使纪录逾期

下图所示的限速算法是一个滑动窗口计数器的例子。一个用户假如提交的挪用数目适中,或许跟着时候的推移将它们分离隔,就永久不会到达速度限定。凌驾10秒窗口内最大请求的用户必需守候充足的时候来恢复其请求。

从命令行动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的速度限定器的简朴示例,这只是入手下手。有一堆战略和东西能够用来架构和完成你的速度限定。而且另有其他的加强功用能够经由过程这个例子来探究,比方:

  • 在相应正文或作为 Retry-after 标头中,让用户晓得在重试之前应当守候若干时候
  • 纪录到达速度限定的请求,以相识用户行动并正告歹意进击
  • 尝试运用其他速度限定算法或其他中间件

请记着,当你研讨API限定时,你是在机能、平安性和用户体验之间举行衡量。你抱负的速度限定解决方案将跟着时候的推移而转变,同时也会斟酌到这些要素。

英文原文地点:https://codeburst.io/api-rate-limiting-with-node-and-redis-95354259c768

更多编程相干学问,请接见:编程入门!!

以上就是经由过程Node+Redi完成API速度限定的细致内容,更多请关注ki4网别的相干文章!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
经由过程Node+Redi完成API速度限定_WEB前端开发

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章

本文来源:搜奇网

本文地址:https://www.sou7.cn/300798.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

推荐阅读