Wróć do listy

Cloud-native development na przykładzie Nest.js

Nest.jsOprogramowanieBack-end
Imoli

Wstęp

Współczesne aplikacje wymagają skalowalności, odporności na awarie i łatwego zarządzania. Dlatego coraz więcej firm przenosi swoje systemy do chmury i wdraża cloud-native development. W tym artykule omówimy zasady budowy aplikacji cloud-native i pokażemy, jak wykorzystać Nest.js do tworzenia nowoczesnych systemów opartych na chmurze.

Co to jest cloud-native development?

Cloud-native to podejście do tworzenia oprogramowania, które od samego początku jest projektowane z myślą o infrastrukturze chmurowej. Aplikacje cloud-native powinny spełniać następujące założenia:

  • Skalowalność – dynamiczne dostosowywanie zasobów w zależności od obciążenia.
  • Odporność na awarie – projektowanie aplikacji tak, aby była w stanie samodzielnie się rekonfigurować i działać mimo awarii poszczególnych komponentów.
  • Elastyczność – możliwość łatwego wdrażania i aktualizowania aplikacji.
  • Automatyzacja – wdrażanie aplikacji za pomocą CI/CD oraz automatyczne zarządzanie infrastrukturą.
  • Mikrousługi i konteneryzacja – modularność i łatwość w zarządzaniu poszczególnymi komponentami aplikacji.

Dlaczego Nest.js?

Nest.js to progresywny framework dla Node.js, który wyróżnia się modularną architekturą, wsparciem dla TypeScriptu, a także doskonałą integracją z systemami chmurowymi. Jest świetnym wyborem dla aplikacji cloud-native z kilku powodów:

Obsługa mikrousług – wbudowane wsparcie dla mikroserwisów przy użyciu np. RabbitMQ, Kafka, gRPC.
Skalowalność – architektura modularna pozwala łatwo dzielić aplikację na mniejsze komponenty.
Wydajność – wykorzystuje asynchroniczny model I/O i zoptymalizowany routing.
Wbudowane mechanizmy bezpieczeństwa – łatwa integracja z OAuth, JWT, CORS itp.
Zgodność z najlepszymi praktykami – wykorzystuje wzorce architektoniczne znane z Angulara i Spring Boota.


Tworzenie aplikacji cloud-native w Nest.js

Mikrousługi w Nest.js

Nest.js posiada natywne wsparcie dla mikroserwisów, co pozwala na tworzenie skalowalnych aplikacji w architekturze rozproszonej. Przykładowa implementacja mikroserwisu w Nest.js:

import { Controller } from '@nestjs/common';
import { MessagePattern } from '@nestjs/microservices';

@Controller()
export class AppController {
  @MessagePattern('get_data')
  getData() {
    return { message: 'Dane z mikroserwisu' };
  }
}

Możemy uruchomić mikroserwis z użyciem RabbitMQ:

const app = await NestFactory.createMicroservice(AppModule, {
  transport: Transport.RMQ,
  options: {
    urls: ['amqp://localhost:5672'],
    queue: 'main_queue',
    queueOptions: { durable: false },
  },
});
await app.listen();

Dzięki temu możemy łatwo skalować aplikację, dodając kolejne instancje mikroserwisów.


Event-driven architecture i message brokers

Event-driven architecture (EDA) to podejście, które pozwala na luźne powiązanie między usługami poprzez wykorzystanie kolejek wiadomości. Nest.js posiada wbudowaną obsługę RabbitMQ, Apache Kafka oraz NATS.

Przykładowe publikowanie wiadomości w RabbitMQ:

import { ClientProxy, ClientProxyFactory, Transport } from '@nestjs/microservices';

const client: ClientProxy = ClientProxyFactory.create({
  transport: Transport.RMQ,
  options: {
    urls: ['amqp://localhost:5672'],
    queue: 'events_queue',
    queueOptions: { durable: false },
  },
});

client.emit('order_created', { orderId: 12345 });

Dzięki temu możemy łatwo realizować asynchroniczne przetwarzanie danych, np. w systemach e-commerce czy IoT.


Automatyzacja wdrożeń i CI/CD

W świecie cloud-native automatyzacja wdrożeń jest kluczowa. W przypadku Nest.js możemy wykorzystać Docker + Kubernetes + GitHub Actions do pełnej automatyzacji CI/CD.

Przykładowy Dockerfile dla aplikacji Nest.js:

FROM node:18
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
RUN npm run build
CMD ["node", "dist/main.js"]
EXPOSE 3000

Aby wdrożyć aplikację w Kubernetes, tworzymy plik deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nest-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nest-app
  template:
    metadata:
      labels:
        app: nest-app
    spec:
      containers:
        - name: nest-container
          image: my-nest-app:latest
          ports:
            - containerPort: 3000

Automatyzację można wdrożyć przy pomocy GitHub Actions:

name: Deploy to Kubernetes
on: push
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Build Docker image
        run: docker build -t my-nest-app:latest .
      - name: Push to Docker Hub
        run: docker push my-nest-app:latest
      - name: Deploy to Kubernetes
        run: kubectl apply -f deployment.yaml

Dzięki temu każda zmiana w repozytorium powoduje automatyczne wdrożenie w środowisku produkcyjnym.


Monitorowanie i skalowanie aplikacji

Aby zapewnić stabilność i wydajność aplikacji cloud-native, konieczne jest monitorowanie. W przypadku Nest.js możemy użyć:

  • Prometheus + Grafana – do zbierania metryk i wizualizacji danych.
  • OpenTelemetry – do śledzenia requestów w architekturze rozproszonej.
  • Datadog / New Relic – do monitorowania logów i wydajności aplikacji.

Przykład integracji Prometheus z Nest.js:

import { Controller, Get } from '@nestjs/common';
import { PrometheusService } from '@willsoto/nestjs-prometheus';

@Controller()
export class AppController {
  constructor(private readonly prometheusService: PrometheusService) {}

  @Get('/metrics')
  getMetrics() {
    return this.prometheusService.metrics();
  }
}

Dzięki temu możemy śledzić np. czas odpowiedzi API, liczbę requestów czy użycie pamięci.


Podsumowanie

Nest.js to świetny wybór do budowy cloud-native applications, ponieważ oferuje:

Wsparcie dla mikrousług i architektury event-driven.
Łatwą integrację z chmurą – Kubernetes, Docker, CI/CD.
Monitorowanie i optymalizację – Prometheus, OpenTelemetry.
Bezpieczeństwo i modularność – mechanizmy autoryzacji i zarządzania danymi.

Chcesz wdrożyć Nest.js w chmurze? Imoli oferuje dedykowane rozwiązania cloud-native, pomagając w budowie wydajnych i skalowalnych systemów. Skontaktuj się z nami, aby dowiedzieć się więcej! 🚀

6 marca 2025
Imoli