Как запустить и подключить два nestjs grpc microservices на одной машине - PullRequest
0 голосов
/ 19 апреля 2019

Я создаю микросервисы Grpc с помощью nestjs.Как я могу соединить оба сервера на своем локальном хосте.

Я пытался использовать 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 голосов
/ 19 апреля 2019

Разобрался! Оказывается, я указывал http url для Grpc службы. Это правильный вариант клиента для второго сервиса.

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).

...