NestJS TCP 微服务部署

问题描述 投票:0回答:1

Nest.JS 上构建了一个主后端网关,我们确实使用 @nestjs/[email protected] 包构建了一个微服务,并让他通过 TCP 层与主后端进行通信。

这就是我们在 main.ts 中定义微服务本身的方式

import { NestFactory } from '@nestjs/core';
import { Transport, MicroserviceOptions } from '@nestjs/microservices';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.createMicroservice<MicroserviceOptions>(
    AppModule,
    {
      transport: Transport.TCP,
      options: {
        host: process.env.HOST || '',
        port: Number(process.env.PORT) || 3000,
        retryAttempts: 3,
        retryDelay: 1000
      }
    }
  );

  await app.listen();
}
bootstrap();

这就是我们在

@Module({})

内的 microservice.module.ts 中注册微服务的方式
    ClientsModule.register([
      {
        name: 'DNS_MICROSERVICE',
        transport: Transport.TCP,
        options: {
          host: process.env.DNS_API_BASEHOST || 'localhost',
          port: 3000
        }
      }
    ])

我认为值得一提的是,我们确实使用了 @MessagePattern() 和 .send(),以便在应用程序之间发送消息。在本地,一切正常。

不幸的是,当部署微服务并通过主后端向已部署的应用程序发送请求时,它会在 30 秒后超时,除此之外没有任何错误。

主后端和微服务部署在不同的服务器上,但是,我们确实从微服务服务器打开了一个 TCP 端口,以便使其能够与外界通信。最重要的是,我们确实检查了防火墙,看起来那方面也没有问题。

我的问题如下 - 是什么让它不起作用?我们如何修复它才能到达使用 TCP 并从我们的主后端作为微服务启动的已部署微服务应用程序?

就我而言,我们正在使用 GCP 和 Dockerhub 进行部署,但不幸的是我个人无法访问这些。

我首先想到的是检查连接是否可以向服务器本身打开。我们确实通过 -nc 检查了端口是否可以打开,并得到了以下结果

ouruser@app:~$ nc -w1 -z -v ansible.our-application.fi 30000
Connection to ansible.our-application.fi (10.1.2.18) 30000 port [tcp/*] succeeded!
ouruser@app:~$ nc -w1 -z -v 182.24.48.244 30000
Connection to 182.24.48.244 30000 port [tcp/*] succeeded!

经过多次超时后,我决定不向我们部署的微服务的单个端点发送请求,而是尝试联系其他端点并确实收到了回报

[Nest] 10448  - 06/09/2023, 12:37:52 PM   ERROR [ClientTCP] Error: read ECONNRESET

我们确实理解 ECONNRESET 意味着 TCP 会话的另一方突然关闭了其连接端。问题仍然是一样的 - 为什么?

最重要的是,我们尝试将微服务部署为独立应用程序,并通过简单的 HTTP 请求发出请求,它确实有效。如果部署为单独的 Nest.JS 应用程序,则构建会按照我们的预期响应请求并发送响应,不会出现超时。但不幸的是,这不是我们需要的。

deployment tcp nestjs microservices backend
1个回答
0
投票

我也遇到这个问题了,请问你解决了吗?能简单告诉我解决方法吗?

© www.soinside.com 2019 - 2024. All rights reserved.