NestJS 微服务架构概览
NestJS 内置了完整的微服务支持。在官方文档的微服务章节中有一张架构图,展示了 NestJS 的微服务方案:通过将不同的功能模块运行在独立的 NestJS 应用中,各应用之间通过各种通信方案进行消息传递。
NestJS 支持的通信方案及其特点:
| 通信方案 | 协议/方式 | 特点 | 适用场景 |
|---|---|---|---|
| TCP(默认) | TCP 连接 | 简单直接,即时通信,轮询方式 | 学习和入门,内部简单通信 |
| Redis | 发布/订阅 | 高性能、低延迟 | 快速消息传递、简单消息队列 |
| MQTT | 发布/订阅协议 | 轻量级、低带宽开销 | 物联网设备、不可靠网络环境 |
| NATS | 分布式消息系统 | 高吞吐量、低延迟、API 简单 | 高性能消息传递 |
| RabbitMQ | AMQP 协议 | 功能丰富(持久化、路由、确认、重试) | 复杂消息传递模式 |
| Kafka | 持久化日志存储 | 高吞吐量、实时数据流处理 | 大规模数据流、日志聚合、实时分析 |
| gRPC | Protocol Buffers | 高性能、跨语言、强类型定义 | 跨语言微服务通信 |
各通信方案详解
TCP(默认方案)
TCP 是 NestJS 微服务的默认通信方式,主要用于理解微服务架构的工作原理。
- 不支持消息持久化 -- 服务重启后消息丢失
- 不支持消息队列 -- 纯即时通信
- 安全性不高 -- 无加密传输
Redis
基于 Redis 的发布/订阅(Pub/Sub)模式进行消息通信。
// main.ts - Redis 传输器配置
const app = await NestFactory.createMicroservice<MicroserviceOptions>(
AppModule,
{
transport: Transport.REDIS,
options: {
host: 'localhost',
port: 6379,
},
},
);
typescript
- 优点:高性能、低延迟
- 缺点:不支持消息持久化,Redis 重启后消息可能丢失
- 适用:快速消息传递、简单的消息队列场景
MQTT
MQTT(Message Queuing Telemetry Transport)是一个轻量级的发布/订阅消息传输协议。
- 优点:轻量级、低带宽开销
- 缺点:功能相对简单
- 适用:物联网设备通信、不可靠网络环境
NATS
NATS 是一个开源的高性能分布式消息系统,同样基于发布/订阅模式。
- 优点:高吞吐量、低延迟、API 简单
- 缺点:不支持复杂的消息路由和持久化
RabbitMQ
RabbitMQ 是一个流行的开源消息代理,支持多种消息传递协议(如 AMQP)。
- 优点:功能丰富 -- 消息持久化、路由、确认、重试;支持发布/订阅、工作队列等多种模式
- 缺点:配置和维护成本较高,性能低于 Redis 和 NATS
Kafka
Kafka 是一个开源的分布式流处理平台。
- 优点:高吞吐量、支持持久化日志存储消息
- 缺点:配置和管理复杂,延迟较高,不适合低延迟场景
gRPC(推荐重点掌握)
gRPC 是 Google 开源的现代化高性能 RPC(远程过程调用)框架,支持多种编程语言(Java、Python、Go、Node.js 等),是连接不同语言、不同服务的理想纽带。
gRPC 的核心工作流程:
1. 编写 .proto 文件定义服务和方法
2. 使用 protoc 编译器自动生成客户端和服务端代码
3. 客户端像调用本地方法一样调用远程服务
4. 数据通过 Protocol Buffers 进行序列化和反序列化
text
gRPC 的唯一学习门槛是需要掌握 .proto 文件的编写语法。这是一个强类型定义语言,用来定义服务接口和方法签名。
// hero.proto - 定义一个简单的 gRPC 服务
syntax = "proto3";
package hero;
service HeroesService {
rpc FindOne (HeroById) returns (Hero) {}
}
message HeroById {
int32 id = 1;
}
message Hero {
int32 id = 1;
string name = 2;
}
protobuf
NestJS 中不涉及的微服务能力
NestJS 的微服务模块主要解决的是服务间通信的问题。关于 Java 生态中常见的网关、服务配置、服务熔断等中间件能力,NestJS 本身并没有内置,需要根据实际业务需求集成相应的 Node.js 第三方库或依赖 K8s 等基础设施来提供。
再次强调:不要生搬硬套 Java 的微服务方案到 Node.js 项目中。NestJS 提供的是一个架子,可以在上面集成各种 Node.js 生态的中间件和工具。
↑