从零入门 NestJS:构建你的第一个 REST API(十二)微服务与 NestJS 高级功能

365 阅读3分钟

微服务与 NestJS 高级功能

随着业务规模扩大,单体应用难以满足高可用、易扩展、易维护的需求。微服务架构通过将系统拆分为多个独立服务,实现了高内聚、低耦合、独立部署。NestJS 原生支持微服务开发,并集成了多种消息队列和高级功能。

微服务架构简介

  • 微服务:将单一应用拆分为多个小型、自治、可独立部署的服务,每个服务聚焦单一业务能力。
  • 优点:易扩展、易维护、容错性好、支持多语言开发。
  • 挑战:服务间通信、数据一致性、分布式事务、运维复杂度提升。

NestJS 微服务通信机制

NestJS 提供了 @nestjs/microservices 包,支持多种通信协议:

  • TCP
  • Redis
  • NATS
  • MQTT
  • RabbitMQ(AMQP)
  • gRPC

1. 安装依赖(以 RabbitMQ 为例)

npm install --save @nestjs/microservices amqplib

2. 创建微服务(服务端)

// main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';

async function bootstrap() {
  const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
    transport: Transport.RMQ,
    options: {
      urls: ['amqp://localhost:5672'],
      queue: 'user_queue',
      queueOptions: { durable: false },
    },
  });
  await app.listen();
}
bootstrap();

3. 创建微服务客户端(调用方)

// app.module.ts
import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { UserService } from './user.service';

@Module({
  imports: [
    ClientsModule.register([
      {
        name: 'USER_SERVICE',
        transport: Transport.RMQ,
        options: {
          urls: ['amqp://localhost:5672'],
          queue: 'user_queue',
        },
      },
    ]),
  ],
  providers: [UserService],
})
export class AppModule {}

4. 服务间通信示例

// user.service.ts
import { Injectable, Inject } from '@nestjs/common';
import { ClientProxy } from '@nestjs/microservices';

@Injectable()
export class UserService {
  constructor(@Inject('USER_SERVICE') private client: ClientProxy) {}

  async getUserProfile(userId: string) {
    // 发送消息到 user_queue,等待响应
    return this.client.send('get_user_profile', userId).toPromise();
  }
}

5. 消费端处理消息

// user.controller.ts
import { Controller } from '@nestjs/common';
import { MessagePattern } from '@nestjs/microservices';

@Controller()
export class UserController {
  @MessagePattern('get_user_profile')
  handleGetUserProfile(userId: string) {
    // 查询数据库并返回用户信息
    return { userId, username: 'nest_user' };
  }
}

常用高级特性

  • 守卫(Guards):用于权限认证、角色校验等,配合微服务可实现跨服务安全控制。
  • 拦截器(Interceptors):可用于日志、缓存、超时、统一响应格式等。
  • 过滤器(Filters):统一处理微服务中的异常和错误。
  • 管道(Pipes):参数校验与转换,保证数据一致性。

典型实战场景

  • 服务拆分:如用户服务、订单服务、支付服务独立部署,互不影响。
  • 跨服务调用:如订单服务通过消息队列调用用户服务获取用户信息。
  • 异步任务处理:如订单创建后异步通知库存服务扣减库存。
  • 服务降级与容错:如某服务不可用时自动降级或重试。

最佳实践与常见坑点

  • 消息格式要标准化,建议统一消息结构,便于扩展和维护。
  • 服务注册与发现,可结合 Consul、Nacos 等实现自动发现。
  • 消息幂等性,避免重复消费导致数据异常。
  • 超时与重试机制,防止服务间调用阻塞。
  • 安全认证,跨服务通信建议加签名或 token 校验。
  • 监控与链路追踪,便于排查分布式问题。
  • 合理拆分服务粒度,避免过度微服务化导致维护困难。

微服务让系统更具弹性和可扩展性,建议多查阅 NestJS 微服务文档RabbitMQ 官方文档 掌握更多高级用法。