NestJSMikroserwisyNode.jsTypeScriptArchitektura

Budowanie skalowalnych mikroserwisów z NestJS

10 stycznia 2024
12 min

Odkryj jak budować solidną i skalowalną architekturę mikroserwisów używając frameworka NestJS z praktycznymi przykładami.

Budowanie skalowalnych mikroserwisów z NestJS

NestJS zapewnia doskonałe wsparcie dla budowania mikroserwisów dzięki swojej modularnej architekturze i wbudowanym dekoratorom. Przyjrzyjmy się, jak stworzyć skalowalny system mikroserwisów.

Dlaczego NestJS do mikroserwisów?

NestJS oferuje kilka zalet dla rozwoju mikroserwisów:

  • Architektura modularna: Łatwe organizowanie kodu w moduły
  • Wbudowane wsparcie: Natywne wsparcie dla różnych warstw transportowych
  • TypeScript: Silne typowanie i lepsze doświadczenie programisty
  • Dekoratory: Czysty i deklaratywny styl kodu

Konfiguracja podstawowego mikroserwisu

// main.ts
import { NestFactory } from '@nestjs/core';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.createMicroservice<MicroserviceOptions>(
    AppModule,
    {
      transport: Transport.TCP,
      options: {
        host: 'localhost',
        port: 8877,
      },
    },
  );
  
  await app.listen();
  console.log('Mikroserwis nasłuchuje');
}
bootstrap();

Wzorce wiadomości

Używaj wzorców wiadomości do definiowania kontraktów komunikacyjnych między serwisami:

// user.controller.ts
import { Controller } from '@nestjs/common';
import { MessagePattern, Payload } from '@nestjs/microservices';

@Controller()
export class UserController {
  @MessagePattern({ cmd: 'get_user' })
  getUser(@Payload() data: { id: number }) {
    return { id: data.id, name: 'Jan Kowalski', email: 'jan@example.com' };
  }

  @MessagePattern({ cmd: 'create_user' })
  createUser(@Payload() userData: CreateUserDto) {
    // Logika tworzenia użytkownika
    return { success: true, userId: 123 };
  }
}

Komunikacja klienta

Połącz się z mikroserwisami z innych serwisów lub bram API:

// api-gateway.service.ts
import { Injectable } from '@nestjs/common';
import { ClientProxy, ClientProxyFactory, Transport } from '@nestjs/microservices';

@Injectable()
export class ApiGatewayService {
  private client: ClientProxy;

  constructor() {
    this.client = ClientProxyFactory.create({
      transport: Transport.TCP,
      options: {
        host: 'localhost',
        port: 8877,
      },
    });
  }

  async getUser(id: number) {
    return this.client.send({ cmd: 'get_user' }, { id }).toPromise();
  }
}

Obsługa błędów

Zaimplementuj właściwą obsługę błędów w serwisach:

import { RpcException } from '@nestjs/microservices';

@MessagePattern({ cmd: 'get_user' })
async getUser(@Payload() data: { id: number }) {
  try {
    const user = await this.userService.findById(data.id);
    if (!user) {
      throw new RpcException('Użytkownik nie znaleziony');
    }
    return user;
  } catch (error) {
    throw new RpcException(error.message);
  }
}

Najlepsze praktyki

  1. Odkrywanie serwisów: Używaj odkrywania serwisów dla dynamicznej lokalizacji serwisów
  2. Circuit Breaker: Zaimplementuj wzorzec circuit breaker dla odporności
  3. Monitorowanie: Dodaj kompleksowe logowanie i monitorowanie
  4. Testowanie: Pisz testy jednostkowe i integracyjne dla każdego serwisu
  5. Dokumentacja: Utrzymuj przejrzystą dokumentację API

Podsumowanie

NestJS zapewnia solidne podstawy do budowania mikroserwisów dzięki swoim dekoratorom, modułom i wbudowanemu wsparciu dla różnych warstw transportowych. Skup się na właściwych granicach serwisów, obsłudze błędów i monitorowaniu dla systemów gotowych do produkcji.