Mikroservices mit TypeScript: Architektur und Praxis von A bis Z

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum TypeScript die ideale Wahl für Microservices ist

Die moderne Backend-Entwicklung entfernt sich zunehmend von Monolithen hin zu einer Microservice-Architektur. TypeScript, als streng typisierte Erweiterung von JavaScript, bietet eine einzigartige Kombination aus Flexibilität und Zuverlässigkeit. Die statische Typisierung zur Kompilierzeit ermöglicht es, Integrationsfehler zwischen Diensten abzufangen, bevor sie in die Produktion gelangen, und das reichhaltige Ökosystem (NestJS, Express, Fastify) bietet fertige Werkzeuge für den Aufbau verteilter Systeme.

In diesem Artikel werden wir den gesamten Zyklus durchgehen: vom Architekturentwurf bis zum Deployment von Microservices mit TypeScript. Sie erfahren, wie Sie die Kommunikation zwischen Diensten organisieren, Message Broker konfigurieren und Ausfallsicherheit gewährleisten.



1. Microservice-Architektur mit TypeScript: Schlüsselprinzipien

1.1 Domänendekomposition

Der erste Schritt ist die Aufteilung der Geschäftslogik in unabhängige Dienste. Jeder Microservice ist für seinen eigenen begrenzten Bereich (Bounded Context) verantwortlich. In TypeScript wird dies auf natürliche Weise durch Module und Pakete ausgedrückt.

Beispiel für die Dekomposition eines Online-Shops:

  • Auth Service — Authentifizierung und JWT-Tokens
  • Product Service — Produktkatalog und Preise
  • Order Service — Bestellabwicklung und -historie
  • Payment Service — Zahlungsabwicklung

Jeder Dienst ist eine separate TypeScript-Anwendung mit eigener package.json, Konfiguration und Einstiegspunkt (main.ts).



1.2 Auswahl des Technologie-Stacks

Für einen schnellen Start wird die Verwendung von NestJS empfohlen — einem Framework, das Microservice-Patterns von Haus aus unterstützt. Es bietet Transportadapter für TCP, Redis, RabbitMQ, Kafka und gRPC.

Basis-Stack:

  • Sprache: TypeScript (strenger Modus, strict: true)
  • Framework: NestJS
  • Message Broker: RabbitMQ (über @nestjs/microservices)
  • Datenbank: PostgreSQL (jeder Dienst seine eigene DB)
  • Containerisierung: Docker + Docker Compose


1.3 Interaktionsmuster

Man unterscheidet zwei Hauptansätze: synchron (HTTP/gRPC) und asynchron (Warteschlangen). Verwenden Sie für zeitkritische Operationen synchrone Anfragen, für Hintergrundaufgaben Warteschlangen.

Beispiel für die Konfiguration eines hybriden Dienstes in NestJS:

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

async function bootstrap() { // HTTP-Server für REST API const app = await NestFactory.create(AppModule); // Anbindung von RabbitMQ für asynchronen Austausch app.connectMicroservice<MicroserviceOptions>({ transport: Transport.RMQ, options: { urls: ['amqp://localhost:5672'], queue: 'orders_queue', queueOptions: { durable: true }, }, });

await app.startAllMicroservices(); await app.listen(3000);}bootstrap();


2. Praktische Umsetzung: Vom Datenmodell zur API

2.1 Erstellung eines gemeinsamen Typenpakets

Um die Duplizierung von Interfaces zwischen Diensten zu vermeiden, lagern Sie gemeinsame Typen in ein separates npm-Paket aus (z.B. @mycompany/shared-types). Dies ist ein entscheidender Vorteil von TypeScript — eine einzige Quelle der Wahrheit für alle Dienste.

// shared-types/src/dto/order.dto.tsexport interface CreateOrderDto {  userId: string;  productId: string;  quantity: number;  totalPrice: number;}

export interface OrderResponse { id: string; status: 'pending' | 'confirmed' | 'cancelled'; createdAt: Date;}


2.2 Implementierung des Product Service (REST API)

Der Dienst für den Produktkatalog. Wir verwenden TypeORM für die Arbeit mit PostgreSQL und NestJS-Dekoratoren f

Blogs

Buchempfehlungen