Как разделить микросервисы Nest.js на отдельные проекты? - PullRequest
0 голосов
/ 11 сентября 2018

Допустим, я хочу создать упрощенную платформу управления кино.Для этого требуется несколько микросервисов: movies, cinemas, payments и т. Д.

Как бы вы поступили в Nest.js?Я не хочу, чтобы они находились в одной большой папке, как будто это монолит.Я хочу, чтобы они были отдельными проектами Nest.js со своими собственными git-репозиториями, чтобы позже я мог организовать их с Kubernetes.

Как?Как подключиться из сервиса cinemas к сервису movies, если они представляют собой два отдельных проекта и используют только, скажем, Redis?

Редактировать: Это вообще не вопрос о микросервисах.Это вопрос Nest.js, специфичный.Я прочитал документацию, я знаю, что есть декораторы типа @Client для подключения к транспортному уровню.Я просто хочу знать, где использовать этот декоратор и, возможно, увидеть небольшой фрагмент кода о том, как «иметь два отдельных репозитория Nest.js, как соединить их вместе, чтобы они могли общаться друг с другом».

Я неМеня не волнует транспортный уровень, я сам могу это понять.Мне просто нужен совет по самой платформе, так как я считаю, что документации не хватает.

1 Ответ

0 голосов
/ 13 сентября 2018

Я получил это работает.В основном, способ сделать это - создать два отдельных проекта.Допустим, один - createMicroservice, а другой - просто приложение HTTP (но может легко стать другим микросервисом).Я использовал «обычное» приложение, чтобы можно было легко вызывать его для тестирования.

Вот файл main.ts, который создает микросервис.

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { Transport } from '@nestjs/common/enums/transport.enum';

async function bootstrap() {
  const app = await NestFactory.createMicroservice(AppModule, {
    transport: Transport.REDIS,
    options: {
      url: 'redis://localhost:6379',
    },
  });
  await app.listen(() => console.log('MoviesService is running.'));
}
bootstrap();

И один из контроллеров:

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @MessagePattern({ cmd: 'LIST_MOVIES' })
  listMovies(): string[] {
    return ['Pulp Fiction', 'Blade Runner', 'Hatred'];
  }
}

Теперь - в микросервисе вы объявляете, на какие события должны реагировать контроллеры (@MessagePattern).Находясь в «нормальной» службе, вы делаете это в контроллере, когда хотите что-то спросить у других микросервисов (main.ts - самый простой пример, который вы получаете, когда создаете новый проект с использованием @nestjs/cli.

Код контроллера:

@Controller()
export class AppController {
  private readonly client: ClientProxy;

  constructor(private readonly appService: AppService) {
    this.client = ClientProxyFactory.create({
      transport: Transport.REDIS,
      options: {
        url: 'redis://localhost:6379',
      },
    });
  }

  @Get()
  listMovies() {
    const pattern = { cmd: 'LIST_MOVIES' };

    return this.client.send<string[]>(pattern, []);
  }
}

Так что, пока client подключен к тому же транспортному уровню, что и микросервис - они могут общаться друг с другом, используя @MessagePattern.

Для лучшего кода вы можете переместить часть this.client из конструктора в поставщика, а затем использовать внедрение зависимостей, объявив поставщика в модуле.

...