如何在同一台机器上运行和连接两个nestjs grpc微服务

时间:2019-04-18 23:12:16

标签: microservices grpc nestjs

我正在用nestjs创建Grpc微服务。如何连接本地主机上的两个服务器。

我尝试使用ngrok为其中一项服务创建隧道,但是我仍然遇到错误“使用中的地址” “未解决的地址总数增加2个” ,即使两者都在不同的端口上运行

第一项服务

import { authServiceOptions } from './auth/grpc/auth.options';
import { notificationClientServiceOptions } from '../../notification/src/notification/grpc/notification.options';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe());
  app.setGlobalPrefix('api/v1/services');

  // Services
  app.connectMicroservice(notificationClientServiceOptions);
  app.connectMicroservice(authServiceOptions);

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

第二次服务

import { AppModule } from './app.module';
import { notificationServiceOptions } from './notification/grpc/notification.options';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe());
  app.setGlobalPrefix('api/v1/services');

  // Services
  app.connectMicroservice(notificationServiceOptions);

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

//第二项服务的客户选项

export const notificationClientServiceOptions: ClientOptions = {
  transport: Transport.GRPC,
  options: {
    url: 'https://b6a4cd09.ngrok.io/',
    package: 'notification',
    protoPath: join(__dirname, './notification.proto'),
  },
};

1 个答案:

答案 0 :(得分:0)

想通了!原来我为 Grpc 服务指定了 http 网址。这是第二项服务的正确客户端选项。

export const notificationClientServiceOptions: ClientOptions = {
  transport: Transport.GRPC,
  options: {
    // you can specify any port that is not in use (just don't prefix it with 'http')
    url: 'localhost:5500', 
    package: 'notification',
    protoPath: join(__dirname, './notification.proto'),
  },
};

我也查看了nestjs的源代码。原来任何微服务的默认URL为 localhost:5000 ,因此,如果您运行的是多个服务,则最好为每个服务指定URL。

我遇到的另一个问题是连接微服务。 如果服务位于两个单独的nestjs项目中,则无需在app.connectMicroservice(secondServiceOptions)中使用firstService,这是因为await app.startAllMicroservicesAsync()会尝试启动两个服务,但会失败。这是因为secondService已在单独的项目中运行。

要使用secondService装饰器从firstService连接到@Client(secondServiceOptions)