当前位置: 首页 > article >正文

Node.js-API 限流与日志优化

​🌈个人主页:前端青山
🔥系列专栏:node.js篇
🔖人终将被年少不可得之物困其一生

依旧青山,本期给大家带来node.js篇专栏内容:node.js-API 限流与日志优化

前言

在前几篇文章中,我们已经为 API 添加了身份验证、CORS 配置、缓存机制和性能监控。本文将继续在这个基础上,进一步增强 API 的稳定性和可维护性。我们将添加 API 限流功能,并对日志进行优化,以便更好地跟踪和调试应用。

目录

前言

目录

1. 添加 API 限流

1.1 安装依赖

1.2 创建限流中间件

1.3 应用限流中间件

2. 优化日志记录

2.1 安装依赖

2.2 创建日志配置

2.3 更新日志中间件

3. 项目结构

4. 运行项目

5. 测试与验证

5.1 测试 API 限流

5.2 验证日志记录

6. 总结与展望

1. 添加 API 限流

为了防止 API 被恶意请求或滥用,我们可以添加 API 限流功能。这有助于保护服务器免受 DDoS 攻击,并确保正常用户的请求能够得到及时响应。我们将使用 express-rate-limit 库来实现这一功能。

1.1 安装依赖

首先,我们需要安装 express-rate-limit 库。打开终端,导航到项目根目录,然后运行以下命令:

npm install express-rate-limit
1.2 创建限流中间件

接下来,我们在 middlewares 目录下创建一个名为 rateLimiter.js 的文件,用于定义限流中间件。

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 文件,添加以下代码:

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 库。打开终端,导航到项目根目录,然后运行以下命令:

npm install winston winston-daily-rotate-file
2.2 创建日志配置

接下来,我们在 config 目录下创建一个名为 logger.js 的文件,用于定义日志配置。

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 文件,使用新的日志配置。

const logger = require('../config/logger');

const logRequest = (req, res, next) => {
  logger.info(`${req.method} ${req.url}`);
  next();
};

module.exports = logRequest;

3. 项目结构

确保项目结构如下:

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 服务已启动。在项目根目录下运行以下命令启动应用:

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 个请求,看看是否会被限流。

  1. 打开 Postman,创建一个新的请求,设置请求方法为 GET,URL 为 http://localhost:3000/items
  2. 快速发送多个请求,直到达到 100 个请求。
  3. 继续发送请求,观察响应是否返回 429 Too Many Requests 状态码,并且包含提示消息 Too many requests from this IP, please try again later.
5.2 验证日志记录

为了验证日志记录是否正确,我们可以检查日志文件和控制台输出。

  1. 在项目根目录下,找到 logs 目录,查看是否有生成的日志文件。
  2. 打开其中一个日志文件,检查其中的内容是否包含了请求的方法、URL 和时间戳。
  3. 同时,检查控制台输出,确保日志信息也显示在控制台上。

6. 总结与展望

通过本文,我们为 API 添加了限流功能,并优化了日志记录,进一步增强了 API 的稳定性和可维护性。API 限流功能可以帮助我们防止恶意请求和 DDoS 攻击,确保正常用户的请求能够得到及时响应。优化后的日志记录系统则可以帮助我们更好地跟踪和调试应用,快速定位问题。

在未来的文章中,我们将继续探索更多高级功能和技术,如 API 版本控制、安全性增强、部署和容器化等。希望这些改进对你有所帮助!如果你有任何问题或建议,请随时留言交流。


http://www.kler.cn/a/386354.html

相关文章:

  • Unity安装后点击登录没反应
  • Android 13 实现屏幕熄屏一段时候后关闭 Wi-Fi 和清空多任务列表
  • 必修 -- 常用笔试题
  • 【JavaEE初阶 — 多线程】生产消费模型 阻塞队列
  • git没有识别出大写字母改成小写重命名的文件目录
  • python解析网页上的json数据落地到EXCEL
  • 【Threejs】相机控制器动画
  • php伪协议介绍
  • 树莓派开发相关知识十 -小试服务器
  • 智能电网能源优化管理系统(Smart Grid Energy Optimization Management System, SGEOMS)
  • jupyter notebook启动和单元格cell
  • java ssm 网上蛋糕店 在线蛋糕甜品管理 网上蛋糕管理 源码 jsp
  • MySQL的约束和三大范式
  • C# NUnit 框架:高效使用指南
  • Spring Boot 集成JWT实现Token验证详解
  • clickhouse 安装配置
  • react动态路由
  • 【重装系统后重新配置2】pycharm 终端无法激活conda环境
  • ORACLE的完全检查点和增量检查点
  • FPGA实现串口升级及MultiBoot(六)ICAPE2原语实例讲解
  • 计算机网络 TCP/IP体系 数据链路层
  • qt QLocale详解
  • 陀螺仪BMI323驱动开发测试(基于HAL库SPI通信)
  • 大数据-213 数据挖掘 机器学习理论 - KMeans Python 实现 距离计算函数 质心函数 聚类函数
  • Python使用PDF相关组件案例详解
  • 从截图到代码:screenshot-to-code开源项目实践指南