NestJS - 2 个微服务之间的通信

标签 nestjs

我使用 TCP 协议(protocol)构建了一个 Http 应用程序和 2 个微服务。

这是我的应用程序图。

enter image description here

// Http App/app.service.ts
constructor() {
    this.accountService = ClientProxyFactory.create({
      transport: Transport.TCP,
      options: {
        host: 'localhost',
        port: 8877,
      },
    });

    this.friendService = ClientProxyFactory.create({
      transport: Transport.TCP,
      options: {
        host: 'localhost',
        port: 8080,
      },
    });
  }

我尝试通过 @Messagepattern() 从帐户服务向好友服务发送消息。

ClientProxy是为每个服务设置的。但它不起作用。

我阅读了官方文档@nestjs/microservices,但我不知道哪个合适。

是否有正确的方法将消息从一个微服务发送到另一个微服务?

最佳答案

您需要设置一个消息代理,例如 RabbitMQ 或 Kafka,即对于 RabbitMQ,输入以下命令并创建 RabbitMQ 容器。

docker run -it --rm --name rabbitmq -p 0.0.0.0:5672:5672 -p 0.0.0.0:15672:15672 -d rabbitmq:3-management

然后将 RabbitMQ 选项传递给您的 main.ts引导函数:


async function bootstrap() {
  const rabbitmqPort = 5672
  const rabbitmqHost = 127.0.0.1
  const app = await NestFactory.create(AppModule);
  app.connectMicroservice<MicroserviceOptions>({
    transport: Transport.RMQ,
    options: {
      urls: [
        `amqp://${rabbitmqHost}:${rabbitmqPort}`,
      ],
      queue: 'myqueue',
      queueOptions: {
        durable: false,
      },
    },
  });


  app
    .startAllMicroservices(() => {
      logger.log('Microservice is listening!');
    })
    .listen(3000, () => {
      logger.log('Api Server is listening on 3000');
    });
}

bootstrap();

用于接收消息:

  @MessagePattern('my_pattern')
  async myController(
    @Payload() data: MYDTO,
  ): Promise<MY TYPE> {
    return await this.accountService.myFunction(data);
  }

现在,当客户端在 myqueue 上发送消息时与 my_pattern模式,客户端发送的数据将是 data来自@playload()注释。

要在任何队列上发送消息,您需要将 RabbitMQ 配置添加到您的应用程序模块,即 account.module.ts ,假设您要在 FriendService 上发送消息

const rabbitmqPort = 5672
const rabbitmqHost = 127.0.0.1

@Module({
  imports: [
    ClientsModule.registerAsync([
      {
        name: 'Friend',
        useFactory: {
          transport: Transport.RMQ,
          options: {
            urls: [
             `amqp://${rabbitmqHost}:${rabbitmqPort}`,
            ],
            queue: 'friend_queue',
            queueOptions: {
              durable: false,
            },
          },
        }
      },
    ]),
  ],
  controllers: [AccountController],
  providers: [AccountService],
})
export class AccountModule {}

然后注入(inject)Friend客户端到您的服务构造函数如下:

    @Inject('Friend')
    private friendClient: ClientProxy,

发送这样的消息:

      const myVar = await this.friendClient.send('Some_pattern', {SOME DATA}).toPromise();

为您的两个微服务设置上述所有配置,它应该可以工作。

关于NestJS - 2 个微服务之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65786135/

相关文章:

typescript - 如何在 Nest 中使用内存数据库和 TypeORM

swagger - 如何在 swagger nestjs 中手动添加摘要和正文

typescript - 如何处理 axios httpservice observable 响应?

javascript - NestJS 哈希密码

javascript - 杀死 nestjs - node.js 进程丢失 redis 连接(微服务)

node.js - 带有自定义 "company_id" header 的 GET 请求在本地有效,但 header 不存在于 GCP App Engine 中

typescript - 使用类转换器公开对象数组

postgresql - 如何在 TypeORM 中定义 varchar 和 enum?

node.js - NestJS .env 文件未构建

node.js - 队列和api的嵌套公牛独立进程