🌈个人主页:前端青山
🔥系列专栏:node.js篇
🔖人终将被年少不可得之物困其一生
依旧青山,本期给大家带来node.js篇专栏内容:node.js-API 限流与日志优化
前言
在前几篇文章中,我们已经为 API 添加了身份验证、CORS 配置、缓存机制和性能监控。本文将继续在这个基础上,进一步增强 API 的稳定性和可维护性。我们将添加 API 限流功能,并对日志进行优化,以便更好地跟踪和调试应用。
目录
[1. 添加 API 限流](#1. 添加 API 限流)
[1.1 安装依赖](#1.1 安装依赖)
[1.2 创建限流中间件](#1.2 创建限流中间件)
[1.3 应用限流中间件](#1.3 应用限流中间件)
[2. 优化日志记录](#2. 优化日志记录)
[2.1 安装依赖](#2.1 安装依赖)
[2.2 创建日志配置](#2.2 创建日志配置)
[2.3 更新日志中间件](#2.3 更新日志中间件)
[3. 项目结构](#3. 项目结构)
[4. 运行项目](#4. 运行项目)
[5. 测试与验证](#5. 测试与验证)
[5.1 测试 API 限流](#5.1 测试 API 限流)
[5.2 验证日志记录](#5.2 验证日志记录)
[6. 总结与展望](#6. 总结与展望)
1. 添加 API 限流
为了防止 API 被恶意请求或滥用,我们可以添加 API 限流功能。这有助于保护服务器免受 DDoS 攻击,并确保正常用户的请求能够得到及时响应。我们将使用 express-rate-limit
库来实现这一功能。
1.1 安装依赖
首先,我们需要安装 express-rate-limit
库。打开终端,导航到项目根目录,然后运行以下命令:
bash
npm install express-rate-limit
1.2 创建限流中间件
接下来,我们在 middlewares
目录下创建一个名为 rateLimiter.js
的文件,用于定义限流中间件。
javascript
const rateLimit = require('express-rate-limit');
const apiLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 分钟
max: 100, // 每个 IP 允许的最大请求数
message: 'Too many requests from this IP, please try again later.',
});
module.exports = apiLimiter;
在这个中间件中,我们设置了每个 IP 在 15 分钟内最多只能发送 100 个请求。如果超过这个限制,客户端将收到一条提示消息,告知其请求过多,需要稍后再试。
1.3 应用限流中间件
最后,我们需要在 app.js
文件中应用这个限流中间件。打开 app.js
文件,添加以下代码:
javascript
require('dotenv').config();
const express = require('express');
const helmet = require('helmet');
const compression = require('compression');
const cors = require('cors');
const swaggerUi = require('swagger-ui-express');
const swaggerJSDoc = require('swagger-jsdoc');
const itemsRouter = require('./routes/items');
const authRouter = require('./routes/auth');
const errorHandler = require('./middlewares/error-handler');
const connectDB = require('./config/db');
const logger = require('./middlewares/logger');
const statusMonitor = require('express-status-monitor');
const apiLimiter = require('./middlewares/rateLimiter');
const app = express();
// 配置 Helmet
app.use(helmet());
// 配置 CORS
app.use(cors());
// 日志中间件
app.use((req, res, next) => {
logger.info(`${req.method} ${req.url}`);
next();
});
app.use(express.json()); // 解析 JSON 请求体
// 压缩响应体
app.use(compression());
// 连接 MongoDB
connectDB();
// 性能监控
app.use(statusMonitor());
// API 限流
app.use(apiLimiter);
// 路由
app.use('/items', itemsRouter);
app.use('/auth', authRouter);
// Swagger 配置
const options = {
definition: {
openapi: '3.0.0',
info: {
title: 'My API',
version: '1.0.0',
description: 'This is a simple API for managing items.',
},
servers: [
{
url: `http://localhost:${process.env.PORT || 3000}`,
},
],
},
apis: ['./routes/*.js'], // 指定包含 API 注解的文件
};
const specs = swaggerJSDoc(options);
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(specs));
// 错误处理中间件
app.use(errorHandler);
module.exports = app;
2. 优化日志记录
为了更好地跟踪和调试应用,我们需要优化日志记录。一个好的日志系统可以帮助我们快速定位问题,了解应用的运行状态。我们将使用 winston
库来实现更详细和灵活的日志记录。
2.1 安装依赖
首先,我们需要安装 winston
和 winston-daily-rotate-file
库。打开终端,导航到项目根目录,然后运行以下命令:
bash
npm install winston winston-daily-rotate-file
2.2 创建日志配置
接下来,我们在 config
目录下创建一个名为 logger.js
的文件,用于定义日志配置。
javascript
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d',
dirname: 'logs',
});
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
transport,
new winston.transports.Console({
format: winston.format.combine(
winston.format.colorize(),
winston.format.simple()
),
}),
],
});
module.exports = logger;
在这个配置中,我们设置了日志文件的命名规则、日期模式、归档方式、最大文件大小和保留天数。同时,我们还配置了控制台输出,以便在开发过程中能够实时查看日志信息。
2.3 更新日志中间件
最后,我们需要更新 middlewares/logger.js
文件,使用新的日志配置。
javascript
const logger = require('../config/logger');
const logRequest = (req, res, next) => {
logger.info(`${req.method} ${req.url}`);
next();
};
module.exports = logRequest;
3. 项目结构
确保项目结构如下:
javascript
my-app/
├── node_modules/
├── public/
│ └── index.html
├── routes/
│ ├── items.js
│ └── auth.js
├── models/
│ ├── item.js
│ └── user.js
├── middlewares/
│ ├── error-handler.js
│ ├── logger.js
│ ├── auth.js
│ ├── cache.js
│ └── rateLimiter.js
├── config/
│ ├── db.js
│ ├── redis.js
│ └── logger.js
├── .env
├── app.js
└── index.js
4. 运行项目
确保 MongoDB 和 Redis 服务已启动。在项目根目录下运行以下命令启动应用:
bash
npm install node index.js
访问 http://localhost:3000/api-docs
查看 Swagger 文档,访问 http://localhost:3000/status
查看性能监控页面。
5. 测试与验证
5.1 测试 API 限流
为了验证 API 限流功能是否生效,我们可以使用 Postman 或其他 HTTP 客户端工具发送多个请求。假设我们设置的限流规则是每个 IP 每 15 分钟最多 100 个请求,我们可以尝试发送超过 100 个请求,看看是否会被限流。
- 打开 Postman,创建一个新的请求,设置请求方法为
GET
,URL 为http://localhost:3000/items
。 - 快速发送多个请求,直到达到 100 个请求。
- 继续发送请求,观察响应是否返回
429 Too Many Requests
状态码,并且包含提示消息Too many requests from this IP, please try again later.
。
5.2 验证日志记录
为了验证日志记录是否正确,我们可以检查日志文件和控制台输出。
- 在项目根目录下,找到
logs
目录,查看是否有生成的日志文件。 - 打开其中一个日志文件,检查其中的内容是否包含了请求的方法、URL 和时间戳。
- 同时,检查控制台输出,确保日志信息也显示在控制台上。
6. 总结与展望
通过本文,我们为 API 添加了限流功能,并优化了日志记录,进一步增强了 API 的稳定性和可维护性。API 限流功能可以帮助我们防止恶意请求和 DDoS 攻击,确保正常用户的请求能够得到及时响应。优化后的日志记录系统则可以帮助我们更好地跟踪和调试应用,快速定位问题。
在未来的文章中,我们将继续探索更多高级功能和技术,如 API 版本控制、安全性增强、部署和容器化等。希望这些改进对你有所帮助!如果你有任何问题或建议,请随时留言交流。