it-swarm.com.de

Wie kann ich Nest.js Microservices in separate Projekte aufteilen?

Angenommen, ich möchte eine vereinfachte Kinomanagement-Plattform erstellen. Es werden nur wenige Mikrodienste benötigt: movies, cinemas, payments usw.

Wie würden Sie es in Nest.js machen? Ich möchte sie nicht in der gleichen großen Mappe haben, aus der sich ein Monolith zusammensetzt. Ich möchte, dass sie separate Nest.js-Projekte mit eigenen Git-Repositorys sind, damit ich sie später mit Kubernetes orchestrieren kann.

Wie? Wie verbinde ich mich von Dienst cinemas zu Dienst movies, wenn es sich um zwei separate Projekte handelt, die nur gemeinsam genutzt werden, sagen wir Redis?

Bearbeiten: Dies ist keine Frage zu Microservices im Allgemeinen. Dies ist eine spezifische Frage von Nest.j. Ich habe die Dokumentation gelesen, ich weiß, es gibt Dekorateure wie @Client zum Verbinden mit der Transportschicht. Ich möchte nur wissen, wo ich diesen Dekorator verwenden soll, und vielleicht einen kurzen Codeausschnitt darüber sehen, wie man zwei separate Nest.js-Repositorys miteinander verbindet, damit sie miteinander kommunizieren können.

Die Transportschicht ist mir egal, das kann ich selbst herausfinden. Ich brauche nur ein paar Ratschläge zum Framework selbst, da ich glaube, dass die Dokumentation fehlt.

13

Ich habe es geschafft. Grundsätzlich müssen zwei separate Projekte erstellt werden. Nehmen wir an, eines ist ein createMicroservice und ein anderes ist nur eine HTTP-App (könnte aber leicht ein anderer Microservice sein). Ich habe eine "normale" App verwendet, damit ich sie einfach zum Testen aufrufen kann.

Hier ist die main.ts - Datei, die den Microservice erstellt.

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();

Und einer der Controller:

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

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

Jetzt - im Microservice legen Sie fest, auf welche Ereignisse die Controller reagieren sollen (@MessagePattern). Im "normalen" Dienst tun Sie dies im Controller, wenn Sie andere Microservices nach etwas fragen möchten (der main.ts Ist das einfachste Beispiel, das Sie erhalten, wenn Sie ein neues Projekt mit @nestjs/cli Erstellen. .

Der Controller-Code:

@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, []);
  }
}

Solange ein client mit der gleichen Transportschicht wie der Microservice verbunden ist, können sie mit dem @MessagePattern Miteinander kommunizieren.

Für besseren Code können Sie den Teil this.client Von einem Konstruktor zu einem Provider verschieben und dann die Abhängigkeitsinjektion verwenden, indem Sie den Provider im Modul deklarieren.

23