Обслуживание публичных и частных портов с использованием Nestjs - PullRequest
0 голосов
/ 07 октября 2019

Я создаю приложение для мобильного приложения. Помимо обслуживания клиента, у него будет несколько функций бэк-офиса.

Мы используем swagger , и мы хотим иметь возможность доступа к документам о фаге наших конечных точек бэк-офиса. Однако мы не хотим обнародовать все наши конечные точки.

Предполагая, что общедоступность всех конечных точек является плохим вариантом, решение, о котором мы думаем, - это позволить нашему серверу обслуживать два порта, а затем выставить общедоступный только один порт. Мы создали небольшой пример репо , который обслуживает клиентский модуль и модуль бэк-офиса на двух разных портах.

main.ts выглядит следующим образом:

import { NestFactory } from '@nestjs/core';
import { ClientModule } from './modules/client/client.module';
import * as express from 'express';
import * as http from 'http';
import {ExpressAdapter} from '@nestjs/platform-express';
import { BackOfficeModule } from './modules/backoffice/backoffice.module';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';

async function bootstrap() {

  const clientServer = express();
  const clientApp = await NestFactory.create(
    ClientModule,
    new ExpressAdapter(clientServer),
  );
  const clientOptions = new DocumentBuilder()
    .setTitle('ClientServer')
    .setDescription('The client server API description')
    .setVersion('1.0')
    .addTag('client')
    .build();
  const clientDocument = SwaggerModule.createDocument(clientApp, clientOptions);
  SwaggerModule.setup('api', clientApp, clientDocument);
  await clientApp.init();

  const backOfficeServer = express();
  const backOfficeApp = await NestFactory.create(
    BackOfficeModule,
    new ExpressAdapter(backOfficeServer),
  );

  const backOfficeOptions = new DocumentBuilder()
    .setTitle('BackOffice')
    .setDescription('The back office API description')
    .setVersion('1.0')
    .addTag('backOffice')
    .build();
  const backOfficeDocument = SwaggerModule.createDocument(backOfficeApp, backOfficeOptions);
  SwaggerModule.setup('api', backOfficeApp, backOfficeDocument);
  await backOfficeApp.init();

  http.createServer(clientServer).listen(3000); // The public port (Load balancer will route traffic to this port)
  http.createServer(backOfficeServer).listen(4000); // The private port (Will be accessed through a bastian host or similar)
}
bootstrap();

Другим вариантом было бы создание большего разделения кодовой базы и инфраструктуры, однако, поскольку это очень ранняя стадия, мы считаем, что в этом нет необходимости.

Наш вопрос к Nest сообщество таким образом, кто-нибудь сделал это? Если да, то каков ваш опыт? Каковы недостатки такого разделения нашего внутреннего кода?

1 Ответ

0 голосов
/ 16 октября 2019

Это нормально, но если вы хотите запустить два сервера на 1 хосте, я бы порекомендовал создать два файла, таких как main-client.ts и main-back-office.ts, и запускать их в разных процессах, потому что в этом случае отказ одного сервера не будетвлияет на работу другого.

Также, если вы не запустите это в Docker, я бы предложил такие инструменты, как навсегда , pm2 , супервизор или моя собственная очень маленькая библиотека working-cluster

Если вы запускаете ее в Docker и не хотите большого рефакторинга, я бы порекомендовал создать 2 одинаковых Dockerfile с разнымипоследние CMD или ENTRYPOINT команды

...