🌐 一网打尽!构建 HSBC 级 API 网关:认证、限流、聚合、监控全搞定

113 阅读3分钟

🌐 一网打尽!构建 HSBC 级 API 网关:认证、限流、聚合、监控全搞定

在汇丰银行,一次客户端请求可能需要调多个后端接口:认证、账户、余额、风控、日志……
如果这些请求都直连后端?那是灾难
本篇教你用 Node.js 手写一个轻量 API Gateway,让你的服务更安全、更稳定、更高效


✅ 为什么写这篇?

汇丰的 API 网关不仅要转发请求,更要支持:

  • ✅ 统一认证鉴权
  • ✅ 接口限流保护
  • ✅ 多接口聚合(BFF 模式)
  • ✅ 日志记录 & 监控
  • ✅ 角色权限过滤

而我们用 Node.js + Express 就能搞出个小而美的版本!


🧰 技术选型

技术用途
Node.js + Express构建主网关服务
express-rate-limit接口限速中间件
jsonwebtokenJWT 鉴权
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 栈实战:搭建一个能追踪每一笔交易的日志可视化平台》