菜单

微服务

相关源文件

本文档全面概述了 NestJS 微服务系统,解释了其架构、通信模式、支持的传输层和实现细节。它侧重于 NestJS 如何实现分布式系统中的服务间通信。有关基于 HTTP 的 RESTful 服务的信息,请参阅 平台适配器

1. NestJS 微服务简介

NestJS Microservices 是一个专用的模块,为构建面向服务的架构提供了一个强大的框架。与传统的基于 HTTP 的应用程序不同,NestJS 微服务可以通过各种传输层进行通信,并支持多种消息模式。

该系统基于两个主要抽象构建

  • 微服务服务器 - 接收和处理消息的服务
  • 微服务客户端 - 向微服务服务器发送消息的组件

来源: packages/microservices/client/client-proxy.ts38-233 packages/microservices/server/server.ts47-288 packages/microservices/interfaces/microservice-configuration.interface.ts25-33

2. 微服务架构

NestJS Microservices 遵循灵活的架构,在客户端、传输和服务器之间分离关注点。这使得应用程序能够与底层传输机制无关地进行通信。

2.1 核心组件

来源: packages/microservices/client/client-proxy.ts38-233 packages/microservices/server/server.ts47-288

2.2 通信模式

NestJS Microservices 支持两种主要的通信模式

  1. 请求-响应 - 客户端发送请求并等待服务响应
  2. 事件驱动 - 客户端发布事件,不等待响应(即发即忘)

来源: packages/microservices/client/client-proxy.ts86-127 packages/microservices/server/server.ts163-180

3. 传输层

NestJS Microservices 支持多种传输层,每种传输层都有其特定的实现和配置选项。

3.1 支持的传输

该框架内置支持以下传输机制

传输描述包依赖
TCP使用 TCP 套接字(sockets)的默认传输Node.js 内置
Redis使用 Redis pub/sub 进行通信ioredis
NATS使用 NATS 消息系统nats
MQTT使用 MQTT 协议mqtt
RabbitMQ使用 RabbitMQ 消息代理amqp-connection-manager, amqplib
Kafka使用 Kafka 进行事件流kafkajs
gRPC使用 gRPC 进行高性能 RPC@grpc/grpc-js, @grpc/proto-loader

来源: packages/microservices/constants.ts3-59 packages/microservices/package.json20-71

3.2 传输配置

每个传输都需要特定的配置选项来建立连接。配置在创建微服务实例时提供。

来源: packages/microservices/interfaces/microservice-configuration.interface.ts25-272 packages/microservices/server/server-grpc.ts66-85

4. 客户端实现

NestJS 微服务的客户端提供抽象,用于与微服务服务器通信,无论传输机制如何。

4.1 ClientProxy 基类

所有客户端实现都继承自 ClientProxy 基类,该类定义了通用功能。

来源: packages/microservices/client/client-proxy.ts38-233

4.2 特定于传输的客户端

每种传输机制都有其专用的客户端实现。

客户端类传输主要方法/特性
ClientTCPTCP使用套接字连接进行通信
ClientRedisRedis使用 Redis pub/sub 机制
ClientNatsNATS使用 NATS 代理进行消息传递
ClientMqttMQTT实现 MQTT 协议客户端
ClientRMQRabbitMQ支持 RabbitMQ 消息模式
ClientGrpcProxygRPC提供具有流式传输支持的 gRPC 客户端

客户端实现处理特定于每个传输的连接、断开连接、重新连接逻辑以及消息序列化。

来源: packages/microservices/client/client-tcp.ts16-216 packages/microservices/client/client-rmq.ts54-436 packages/microservices/client/client-grpc.ts31-402

4.3 消息模式

客户端使用两种主要方法进行通信

  1. send() - 用于请求-响应消息模式

  2. emit() - 用于事件驱动消息模式

来源: packages/microservices/client/client-proxy.ts86-127 packages/microservices/test/client/client-proxy.spec.ts86-133

5. 服务器实现

NestJS 微服务的服务器端接收和处理来自客户端的消息。

5.1 Server 基类

抽象类 Server 为所有特定于传输的服务器实现提供了基础。

来源: packages/microservices/server/server.ts47-288 packages/microservices/test/server/server.spec.ts6-15

5.2 特定于传输的服务器

每种传输机制都有其专用的服务器实现。

服务器类传输特性
ServerTCPTCP基于套接字的服务器,使用 JSON 通信
ServerRedisRedis使用 Redis pub/sub 进行通信
ServerNatsNATS与 NATS 消息系统集成
ServerMqttMQTT实现 MQTT 协议服务器
ServerRMQRabbitMQ支持 RabbitMQ 队列模式和交换器
ServerGrpcgRPC实现具有流式传输支持的 gRPC 服务

来源: packages/microservices/server/server-tcp.ts29-227 packages/microservices/server/server-rmq.ts53-332 packages/microservices/server/server-grpc.ts56-726

5.3 消息处理

服务器通过将传入的消息与注册的模式处理程序进行匹配来处理它们。

来源: packages/microservices/server/server.ts127-161 packages/microservices/server/server-rmq.ts226-284

6. gRPC集成

gRPC值得特别关注,因为它通过使用 Protocol Buffers 进行消息定义和支持流式通信,与其他传输方式不同。

6.1 gRPC服务定义

NestJS gRPC 集成需要 Protocol Buffer (.proto) 文件来定义服务。

来源: packages/microservices/server/server-grpc.ts551-573 packages/microservices/server/server-grpc.ts635-652

6.2 流式支持

gRPC 支持四种类型的远程过程调用:

  1. Unary - 简单的请求-响应
  2. Server Streaming - 客户端发送一个请求,服务器用一个流响应
  3. Client Streaming - 客户端发送一个流,服务器用单个响应响应
  4. Bidirectional Streaming - 客户端和服务器都发送流

NestJS 通过专门的处理器支持所有这些模式。

来源: packages/microservices/server/server-grpc.ts233-259 packages/microservices/server/server-grpc.ts261-396

6.3 客户端 gRPC

ClientGrpcProxy 提供了与 gRPC 服务交互的方法。

来源: packages/microservices/client/client-grpc.ts68-82 packages/microservices/client/client-grpc.ts154-293

7. 错误处理和重连

NestJS 微服务为错误处理和重连策略提供了内置机制。

7.1 错误处理

错误处理发生在多个级别:

  1. 客户端 - 发送或接收消息期间的错误会被传播到 Observable。
  2. 传输级别 - 连接错误会被记录,并可能触发重连。
  3. 服务器端 - 处理错误会返回给客户端。

来源: packages/microservices/client/client-proxy.ts139-158 packages/microservices/server/server.ts152-161

7.2 重连策略

不同的传输方式实现了不同的重连策略。

来源: packages/microservices/client/client-redis.ts202-226 packages/microservices/client/client-rmq.ts77-85

8. 上下文对象

NestJS 微服务提供上下文对象,以便在消息处理程序中访问特定于传输的信息。

8.1 上下文层级

来源: packages/microservices/ctx-host/base-rpc.context.ts packages/microservices/ctx-host/rmq.context.ts

8.2 在处理程序中使用上下文

上下文对象会传递给消息处理程序,允许在其中访问特定于传输的功能。

来源: packages/microservices/server/server-rmq.ts240-246 packages/microservices/server/server-grpc.ts262-269

9. 序列化和反序列化

NestJS 微服务提供了一个灵活的序列化系统,用于在传输格式和应用程序对象之间转换消息。

9.1 序列化流程

来源: packages/microservices/server/server.ts241-265 packages/microservices/client/client-proxy.ts208-232

9.2 自定义序列化器和反序列化器

每个传输器都通过配置支持自定义的序列化器和反序列化器。

来源: packages/microservices/interfaces/serializer.interface.ts packages/microservices/interfaces/deserializer.interface.ts

10. 结论

NestJS 微服务提供了一个强大而灵活的框架,用于使用多种通信模式和传输机制构建分布式系统。该架构允许轻松扩展和自定义,同时提供健壮的默认设置。

要点

  • 支持多种传输机制(TCP、Redis、NATS、MQTT、RabbitMQ、Kafka、gRPC)
  • 提供请求-响应和事件驱动的通信模式
  • 包含内置的错误处理和重连策略
  • 为处理程序提供特定于传输的上下文对象
  • 支持自定义序列化和反序列化

有关特定传输方式的更多信息,请参阅传输层部分 4.1 或查阅 NestJS 文档。

来源: packages/microservices/package.json1-73 packages/core/package.json20-62