node.js - Hvordan dele Nest.js-mikrotjenester inn i separate prosjekter?


La oss si at jeg vil lage en enkel kino-administrasjonsplattform. Den trenger noen få mikrotjenester: movies, cinemas, payments, osv.

Hvordan ville du gått frem for å gjøre det i Nest.js? Jeg vil ikke ha dem i den samme store mappen, da det føles som å lage en monolitt. Jeg vil at de skal være separate Nest.js-prosjekter med sine egne git-repositorier, slik at jeg kan orkestrere dem med Kubernetes senere.

Hvordan? Hvordan koble fra tjenesten cinemas til tjenesten movies hvis de er to separate prosjekter og kun deler, la oss si, Redis?

Rediger: Dette er ikke et spørsmål om mikrotjenester generelt. Dette er et spørsmål spesifikt om Nest.js. Jeg har lest dokumentasjonen, jeg vet at det finnes dekoratører som @Client for å koble til transportlaget. Jeg vil bare vite hvor jeg skal bruke den dekoratøren og kanskje se et kort kodeeksempel på "hvordan man har to separate Nest.js-repositorier og kobler dem sammen slik at de kan kommunisere med hverandre".

Jeg bryr meg ikke om transportlaget, det der kan jeg finne ut av selv. Jeg trenger bare noen råd om selve rammeverket, da jeg mener dokumentasjonen mangler.

Svar #1

Jeg fikk det til å fungere. I hovedsak er måten å gjøre det på å lage to separate prosjekter. La oss si - ett er en createMicroservice og det andre er bare en HTTP-app (men kunne like gjerne vært en annen mikroservice). Jeg brukte en "vanlig" app bare slik at jeg enkelt kan kalle den for testing.

Her er main.ts-filen som oppretter mikrotjenesten.

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

Og en av kontrollerne:

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

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

Nå - i mikroservicen erklærer du hvilke typer hendelser kontrollerne skal reagere på (@MessagePattern). Mens i den "vanlige" tjenesten gjør du dette i kontrolleren når du vil spørre andre mikroservicer om noe ( main.ts er det enkleste eksempelet du får når du oppretter et nytt prosjekt ved å bruke @nestjs/cli.

Kontrollerkoden:

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

Så lenge en client er koblet til det samme transportlaget som mikrotjenesten, kan de kommunisere med hverandre ved å bruke @MessagePattern.

For penere kode kan du flytte this.client-delen fra en konstruktør til en leverandør og deretter bruke avhengighetsinjeksjon ved å erklære leverandøren i modulen.

Relaterte artikler