API 网关是现代微服务架构中的重要组件,它可以统一多个服务的入口,提供请求路由、身份验证、负载均衡等功能。
在本教程中,我们将探索如何使用 NestJS 实现一个简单的 API 网关。
NestJS 提供了一个层次化的模块系统,非常适合构建可维护的 API 网关。它支持 TypeScript,默认集成了 Express.js(可以切换成 Fastify),并提供了大量的模块和中间件来轻松处理 HTTP 请求。
为了组织代码,我们创建一个专门的网关模块:
bashnest generate module api-gateway
这将创建一个 api-gateway.module.ts
文件,它将作为我们的网关功能的根模块。
在 API 网关模块中,我们将配置路由并代理到不同的微服务。首先,安装 HTTP 代理中间件:
bashnpm install http-proxy-middleware
接下来,编辑 api-gateway.module.ts
文件,设置代理规则:
typescriptimport { 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)来实现这些功能。
例如,创建一个简单的守卫:
typescriptimport { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; @Injectable() export class AuthGuard implements CanActivate { canActivate(context: ExecutionContext): boolean { const request = context.switchToHttp().getRequest(); // 逻辑来检查用户是否认证 return true; // 或者 false,如果用户未认证 } }
将守卫应用于路由:
typescriptconsumer .apply(AuthGuard) .forRoutes('*');
现在,启动你的网关,让它开始工作:
bashnpm run start
API 网关应该可以处理请求并将它们路由到适当的后端服务了,同时还可以处理身份验证等事务。
NestJS 提供了强大的抽象和工具来构建复杂的网关逻辑,比如使用拦截器来处理响应,或者利用管道来转换请求。继续探索 NestJS 的文档,你将发现更多高级特性来提升你的网关。