微服务与 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 官方文档 掌握更多高级用法。