【问题标题】:NestJS - Communication between 2 microserviceNestJS - 2 个微服务之间的通信
【发布时间】:2021-04-23 10:28:16
【问题描述】:

我使用 TCP 协议构建了一个 Http 应用和 2 个微服务。

这是我的应用图。

// 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,但不知道哪个合适。

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

【问题讨论】:

    标签: nestjs


    【解决方案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);
      }
    
    

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

    要在任何队列上发送消息,您需要将 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();
    

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

    【讨论】:

      猜你喜欢
      • 2019-01-18
      • 2020-07-15
      • 2016-08-10
      • 2016-06-10
      • 1970-01-01
      • 2016-03-05
      • 2018-01-22
      • 1970-01-01
      • 2017-07-15
      相关资源
      最近更新 更多