Как запустить и подключить два микросервиса nestjs grpc на одном компьютере

#microservices #grpc #nestjs

#микросервисы #grpc #nestjs

Вопрос:

Я создаю микросервисы 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:

Понял это! Оказывается, я указывал 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) декоратор.