在Koa中如何限制请求频率?

在 Koa 中设置请求频率限制(即限流)可以使用一些中间件来防止用户过度请求。常见的方式是使用现成的库,例如 koa-ratelimit 或者 rate-limiter-flexible。它们可以限制某个 IP 在给定时间段内的请求数量,从而防止滥用。

使用 koa-ratelimit 设置请求频率限制

1.安装依赖:

yarn add koa-ratelimit
npm install koa-ratelimit
pnpm install koa-ratelimit

2.在 app.js 中设置请求频率限制:

在 app.js 文件中配置请求频率限制。以下是一个使用内存存储限流器的示例:

// app.js
const Koa = require('koa');
const cors = require('koa2-cors');
const app = new Koa();
const compress = require('koa-compress');
const port = 3000;
const router = require('./routers');
const errorHandler = require('./utils/errorHandler.js');
const helmet = require('koa-helmet');
const ratelimit = require('koa-ratelimit');

// 使用内存作为限流存储
const db = new Map();

app.use(ratelimit({
  driver: 'memory',  // 使用内存作为存储,可以改为 'redis' 使用 Redis
  db: db,            // 存储方式
  duration: 60000,   // 限制周期,单位是毫秒,这里是 1 分钟
  errorMessage: '请求频率过高,请稍后再试。',
  id: (ctx) => ctx.ip, // 以 IP 地址作为标识
  headers: {
    remaining: 'X-RateLimit-Remaining',
    reset: 'X-RateLimit-Reset',
    total: 'X-RateLimit-Limit'
  },
  max: 100,  // 每个 IP 每分钟最多允许 100 个请求
  disableHeader: false,  // 是否禁用自定义响应头
}));

在这个例子中,koa-ratelimit 将限制每个 IP 每分钟最多发出 100 个请求。超出限制时,会返回错误信息 “请求频率过高,请稍后再试。”。

使用 rate-limiter-flexible

rate-limiter-flexible 是另一个功能强大的限流库,可以与 Koa 集成并提供更高级的限流功能。

1.安装 rate-limiter-flexible:

yarn add rate-limiter-flexible
npm install rate-limiter-flexible
pnpm install rate-limiter-flexible

在 app.js 中设置限流:

这里我们使用内存限流器,也可以换成 Redis。

const Koa = require('koa');
const { RateLimiterMemory } = require('rate-limiter-flexible');

const app = new Koa();

// 初始化内存限流器
const rateLimiter = new RateLimiterMemory({
  points: 100, // 每个 IP 每分钟 100 个请求
  duration: 60, // 请求周期 60 秒
});

// 限流中间件
app.use(async (ctx, next) => {
  try {
    // 检查请求是否超过限流
    await rateLimiter.consume(ctx.ip); // 根据 IP 限制
    await next(); // 没有超过限流则继续执行下一个中间件
  } catch (rejRes) {
    // 超过限流,返回错误响应
    ctx.status = 429;
    ctx.body = '请求频率过高,请稍后再试。';
  }
});

app.use(async (ctx) => {
  ctx.body = 'Hello World';
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

这段代码会限制每个 IP 在 60 秒内最多发送 100 个请求。如果超过限制,则会返回 429 Too Many Requests 状态码和相应的提示信息。

总结

  • koa-ratelimitrate-limiter-flexible 都可以实现限流。
  • 根据需求,你可以选择内存存储或 Redis 存储进行限流,具体取决于你的部署架构(单个实例或负载均衡下的多实例)。
  • 可以根据业务需要调整请求频率、时间周期和限流规则。

原文链接

在Koa中如何限制请求频率?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值