我试图了解 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
| 归档时间: |
|
| 查看次数: |
10192 次 |
| 最近记录: |