为什么你的项目需要基于JavaScript的API网关?
想象一下,你的后端是一个巨大的购物中心。里面有几十家商店(微服务):一家卖书,一家卖衣服,一家卖电子产品。每家商店都有自己的入口、自己的规则和自己的语言。现在想象一下,顾客(客户端应用)为了买一件T恤,必须跑遍所有这些入口。一片混乱,对吧?
在Web开发世界中,API网关解决了这个问题——它是所有微服务的统一入口点。它就像购物中心的管理员:引导请求、检查票据(令牌)、从不同商店收集数据,并将准备好的响应返回给客户端。今天,我们将讨论如何使用Node.js用纯JavaScript编写这样一个网关。
这篇文章既适合刚接触微服务架构的初学者,也适合希望看到实际代码示例的经验丰富的开发者。我们开始吧!
什么是API网关,为什么需要它?
API网关是一个服务器端组件,充当客户端和内部服务之间的中间层。它负责:
- 路由——将请求引导到正确的微服务。
- 身份验证和授权——检查用户是否有访问权限。
- 数据聚合——将来自多个服务的响应合并为一个。
- 请求限流——保护后端免受过载。
- 协议转换——例如,将REST转换为GraphQL。
对于JavaScript服务(尤其是基于Node.js的),API网关是一个自然的选择。它很容易用Express、Koa或Fastify编写,而且最重要的是,它允许在整个项目中保持统一的代码风格。
设计基于Node.js的API网关结构
在编写代码之前,让我们先确定架构。假设我们有三个微服务:
users-service——用户管理(端口3001)。orders-service——订单(端口3002)。products-service——产品目录(端口3003)。
客户端(前端)只访问端口8080上的网关。网关自行决定将请求发送到哪里。
步骤1. Express基础设置
创建一个新项目并安装依赖项:
mkdir api-gatewaycd api-gatewaynpm init -ynpm install express http-proxy-middleware dotenv现在,编写一个简单的网关,将请求代理到服务:
// gateway.jsconst express = require('express');const { createProxyMiddleware } = require('http-proxy-middleware');require('dotenv').config();
const app = express();const PORT = process.env.PORT || 8080;
// 微服务的路由app.use('/users', createProxyMiddleware({ target: 'http://localhost:3001', changeOrigin: true,}));
app.use('/orders', createProxyMiddleware({ target: 'http://localhost:3002', changeOrigin: true,}));
app.use('/products', createProxyMiddleware({ target: 'http://localhost:3003', changeOrigin: true,}));
app.listen(PORT, () => { console.log(`API网关已在端口${PORT}上启动`);});就这样!现在任何对/users的请求都会自动重定向到users-service。但这只是开始。真正的网关应该做得更多。
添加身份验证和令牌检查
API网关的主要任务之一是集中式身份验证。与其在每个微服务中检查JWT,我们只需在网关中执行一次。
添加用于检查令牌的中间件:
// middleware/auth.jsconst jwt = require('jsonwebtoken');
const authMiddleware = (req, res, next) =>