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