NestJS 拥有内置的微服务支持 — 它可以作为微服务运行,通过各种传输层 (TCP、Redis、NATS、RabbitMQ、Kafka、gRPC) 而不是 HTTP 进行通信,使用一致的、基于消息的编程模型。相同的 NestJS 结构(模块、服务、DI)适用;只有传输层和消息模式改变。
创建微服务
ts
app = .(, {
: .,
: { : , : },
});
app.();
NestJS 拥有内置的微服务支持 — 它可以作为微服务运行,通过各种传输层 (TCP、Redis、NATS、RabbitMQ、Kafka、gRPC) 而不是 HTTP 进行通信,使用一致的、基于消息的编程模型。相同的 NestJS 结构(模块、服务、DI)适用;只有传输层和消息模式改变。
app = .(, {
: .,
: { : , : },
});
app.();
@Controller()
export class MathController {
// REQUEST-RESPONSE: respond to a message and RETURN a result (RPC-style)
@MessagePattern({ cmd: "sum" })
sum(data: number[]): number {
return data.reduce((a, b) => a + b, 0); // the caller awaits this result
}
// EVENT-BASED: react to an event, NO response expected (fire-and-forget)
@EventPattern("order_created")
handleOrderCreated(data: OrderDto) {
this.processOrder(data); // just react; nothing returned
}
}
两种通信风格:@MessagePattern 用于请求-响应(调用方等待结果,类似 RPC)和 @EventPattern 用于事件(发送即忘,解耦 — 发布者不等待)。
@Injectable()
export class AppService {
constructor(@Inject("MATH_SERVICE") private client: ClientProxy) {}
async getSum() {
// send() → request-response (returns an Observable of the result)
return this.client.send({ cmd: "sum" }, [1, 2, 3]);
// emit() → fire an event (no response)
this.client.emit("order_created", orderData);
}
}
ClientProxy(通过 ClientsModule 配置)向其他服务发送消息/事件 — send() 用于请求-响应,emit() 用于事件。
// an app can serve HTTP AND connect microservice transports simultaneously
const app = await NestFactory.create(AppModule);
app.connectMicroservice({ transport: Transport.RMQ, options: {...} });
await app.startAllMicroservices();
await app.listen(3000); // HTTP too
TCP → simple direct service-to-service
Redis/NATS → lightweight pub/sub messaging
RabbitMQ/Kafka → robust message queues/streams (durability, retries, decoupling)
gRPC → high-performance, strongly-typed RPC (protobuf)
→ Async message brokers (RMQ/Kafka) give decoupling & resilience; gRPC gives speed+typing.
NestJS 的内置微服务支持之所以重要,是因为它让你能够使用相同熟悉的 NestJS 结构(模块、提供者、DI、装饰器)构建分布式系统,同时将 HTTP 交换为基于消息的传输层 — 这是一个巨大的生产力和一致性优势。
理解它对于设计可扩展系统很重要:消息模式(请求-响应)与事件模式(发送即忘)的区别直接映射到微服务通信的根本选择 — 同步 RPC 风格调用与异步、解耦的事件(后者通过消息代理提供弹性和松耦合,这使微服务更加健壮)。
了解如何创建微服务、定义消息/事件处理器、通过 ClientProxy 调用其他服务、构建混合 HTTP+微服务应用,以及选择传输层(轻量级 pub/sub 对比持久队列如 Kafka/RabbitMQ 对比高性能 gRPC)是设计分布式后端的有价值的高级知识。
尽管微服务增加了真实的复杂性(且不总是相比单体更优选择),NestJS 使实现干净一致,这使其成为构建大规模、分布式 NestJS 系统的重要架构主题。