🌐 一网打尽!构建 HSBC 级 API 网关:认证、限流、聚合、监控全搞定
在汇丰银行,一次客户端请求可能需要调多个后端接口:认证、账户、余额、风控、日志……
如果这些请求都直连后端?那是灾难。
本篇教你用 Node.js 手写一个轻量 API Gateway,让你的服务更安全、更稳定、更高效!
✅ 为什么写这篇?
汇丰的 API 网关不仅要转发请求,更要支持:
- ✅ 统一认证鉴权
- ✅ 接口限流保护
- ✅ 多接口聚合(BFF 模式)
- ✅ 日志记录 & 监控
- ✅ 角色权限过滤
而我们用 Node.js + Express 就能搞出个小而美的版本!
🧰 技术选型
| 技术 | 用途 |
|---|---|
| Node.js + Express | 构建主网关服务 |
| express-rate-limit | 接口限速中间件 |
| jsonwebtoken | JWT 鉴权 |
| morgan | 请求日志记录 |
| http-proxy-middleware | 请求代理转发 |
🚀 实战:打造一条“金融级 API 流量通道”
🔧 Step 1:项目初始化
npm init -y
npm install express express-rate-limit jsonwebtoken morgan http-proxy-middleware
🔧 Step 2:定义网关骨架 gateway.js
const express = require('express');
const rateLimit = require('express-rate-limit');
const jwt = require('jsonwebtoken');
const morgan = require('morgan');
const { createProxyMiddleware } = require('http-proxy-middleware');
const app = express();
const PORT = 8080;
const SECRET = 'HSBC_SECRET_KEY';
app.use(morgan('combined')); // 日志记录
app.use(express.json());
🔐 Step 3:统一身份验证中间件
function verifyToken(req, res, next) {
const token = req.headers['authorization']?.split(' ')[1];
if (!token) return res.status(401).json({ msg: '缺少令牌' });
try {
const user = jwt.verify(token, SECRET);
req.user = user;
next();
} catch {
res.status(403).json({ msg: '无效 Token' });
}
}
🧯 Step 4:接口限流保护
const limiter = rateLimit({
windowMs: 60 * 1000, // 1分钟
max: 20, // 每个IP最多20次请求
message: '请求太频繁,请稍后重试'
});
🔀 Step 5:定义代理路由(转发到多个后端)
// 统一使用 verifyToken + limiter
app.use('/api/account', verifyToken, limiter,
createProxyMiddleware({ target: 'http://localhost:3001', changeOrigin: true })
);
app.use('/api/balance', verifyToken, limiter,
createProxyMiddleware({ target: 'http://localhost:3002', changeOrigin: true })
);
🧠 Step 6:聚合接口(多接口合并返回)
app.get('/api/dashboard', verifyToken, async (req, res) => {
const fetch = (...args) => import('node-fetch').then(({ default: f }) => f(...args));
const [account, balance] = await Promise.all([
fetch('http://localhost:3001/account'),
fetch('http://localhost:3002/balance')
]);
const result = {
account: await account.json(),
balance: await balance.json()
};
res.json(result);
});
🖥️ 测试效果演示
✅ 使用 JWT Token 请求 /api/account:成功转发 + 鉴权 + 限流
✅ 请求 /api/dashboard 一次 → 后端自动并发获取 2 个接口数据
✅ 所有请求打印在日志中,方便审计追踪
⚠️ 易错点总结
| 错误点 | 描述 |
|---|---|
| ❌ Token 没有 expires 字段 | 容易泄露 |
| ❌ Proxy target 写死 | 可用配置文件/环境变量动态加载 |
| ❌ 接口未限流,轻易被刷爆 | 限流必加!尤其是敏感接口 |
✅ 建议增强功能:
- 接入 Prometheus + Grafana 查看接口 QPS、响应时长
- 给 Token 添加角色字段,实现接口级别权限控制
- 使用 Redis 实现 Token 黑名单或限流多节点共享
🎯 总结
- 本文用 Node.js 构建了一个银行级 API 网关系统
- 实现了认证鉴权 + 限流保护 + 接口聚合 + 日志追踪
- 是构建前后端解耦系统的核心基础设施!
下一篇,我们将走进数据世界:
📦 《ELK 栈实战:搭建一个能追踪每一笔交易的日志可视化平台》