NestJS 应用程序如何侦听与连接的微服务相同的端口?

szc*_*csl 7 node.js nestjs

我试图了解 Nest 微服务的工作原理。

让我们从文档中的这个示例开始(https://docs.nestjs.com/faq/hybrid-application

const app = await NestFactory.create(AppModule);
// microservice #1
const microserviceTcp = app.connectMicroservice<MicroserviceOptions>({
  transport: Transport.TCP,
  options: {
    port: 3001,
  },
});
// microservice #2
const microserviceRedis = app.connectMicroservice<MicroserviceOptions>({
  transport: Transport.REDIS,
  options: {
    url: 'redis://localhost:6379',
  },
});

await app.startAllMicroservicesAsync();
await app.listen(3001);
Run Code Online (Sandbox Code Playgroud)

在查看源代码(https://github.com/nestjs/nest)后,我明白connectMicroservice创建一个net.Serverwhen using TCP,并且服务器在startAllMicroservicesAsync调用时开始监听。但随后app.listen应该初始化基础 Nest Web 服务器的监听。

为什么这不会导致错误?

我检查了如果端口上连接了两个微服务会发生什么。它肯定会引发错误。我在这里缺少什么?

// CODE CAUSES ERROR AS EXPECTED

const app = await NestFactory.create(AppModule);
// microservice #1
const microserviceTcp = app.connectMicroservice<MicroserviceOptions>({
  transport: Transport.TCP,
  options: {
    port: 3001,
  },
});

// microservice #2  <--- THIS WILL CAUSE AN ERROR AS EXPECTED
const microserviceTcp = app.connectMicroservice<MicroserviceOptions>({
  transport: Transport.TCP,
  options: {
    port: 3001,
  },
});

await app.startAllMicroservicesAsync();
await app.listen(3001);
Run Code Online (Sandbox Code Playgroud)

szc*_*csl 10

如果有人感兴趣:这是因为微服务和“经典”Nest 应用程序注册具有不同默认值的端口。使用lsof检查打开的 TCP 套接字就可以立即清楚。

localhost:3000 (LISTEN). // microservice
*:3000 (LISTEN)          // http app
Run Code Online (Sandbox Code Playgroud)

如果我明确提供了in hostname,HTTP 应用程序将无法启动,如预期的那样。localhostapp.listenmain.ts