基于NestJS 实现 API 网关服务,支持身份验证、负载均衡

前言

API 网关是现代微服务架构中的重要组件,它可以统一多个服务的入口,提供请求路由、身份验证、负载均衡等功能。

在本教程中,我们将探索如何使用 NestJS 实现一个简单的 API 网关。

为什么选择 NestJS 作为 API 网关?

NestJS 提供了一个层次化的模块系统,非常适合构建可维护的 API 网关。它支持 TypeScript,默认集成了 Express.js(可以切换成 Fastify),并提供了大量的模块和中间件来轻松处理 HTTP 请求。

实现方式

一、创建 API 网关模块

为了组织代码,我们创建一个专门的网关模块:

bash
nest generate module api-gateway

这将创建一个 api-gateway.module.ts 文件,它将作为我们的网关功能的根模块。

二、配置路由和代理

在 API 网关模块中,我们将配置路由并代理到不同的微服务。首先,安装 HTTP 代理中间件:

bash
npm install http-proxy-middleware

接下来,编辑 api-gateway.module.ts 文件,设置代理规则:

typescript
import { Module, MiddlewareConsumer, NestModule } from '@nestjs/common'; import { createProxyMiddleware } from 'http-proxy-middleware'; @Module({}) export class ApiGatewayModule implements NestModule { public configure(consumer: MiddlewareConsumer): void { consumer .apply( createProxyMiddleware('/service1', { target: 'http://localhost:3001', changeOrigin: true }), createProxyMiddleware('/service2', { target: 'http://localhost:3002', changeOrigin: true }), ) .forRoutes('*'); } }

在上面的代码中,我们为 /service1/service2 配置了两个代理规则。每个服务的请求都会被转发到相应的微服务。

三、添加身份验证和权限

API 网关通常也负责用户的身份验证和权限校验。你可以利用 NestJS 的守卫(Guard)和拦截器(Interceptor)来实现这些功能。

例如,创建一个简单的守卫:

typescript
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; @Injectable() export class AuthGuard implements CanActivate { canActivate(context: ExecutionContext): boolean { const request = context.switchToHttp().getRequest(); // 逻辑来检查用户是否认证 return true; // 或者 false,如果用户未认证 } }

将守卫应用于路由:

typescript
consumer .apply(AuthGuard) .forRoutes('*');

四、启动网关

现在,启动你的网关,让它开始工作:

bash
npm run start

API 网关应该可以处理请求并将它们路由到适当的后端服务了,同时还可以处理身份验证等事务。

总结

NestJS 提供了强大的抽象和工具来构建复杂的网关逻辑,比如使用拦截器来处理响应,或者利用管道来转换请求。继续探索 NestJS 的文档,你将发现更多高级特性来提升你的网关。