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

时间:2021-01-19 05:50:26

标签: nestjs

我使用 TCP 协议构建了一个 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,但我不知道哪个合适。

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

1 个答案:

答案 0 :(得分:1)

您需要设置一个消息代理,例如 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 {}

然后像这样将 Friend 客户端注入您的服务构造函数:

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

发送这样的消息:

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

为您的两个微服务设置上述所有配置,它就会工作。