Mikroservices mit TypeScript: Ihr erster Schritt zu einer modularen Architektur
\n\nStellen Sie sich vor, Sie bauen ein Haus. Sie könnten eine einzige riesige Wand errichten und dann nach und nach Räume hinzufügen. Aber wenn ein Raum kaputt geht, leidet das gesamte Gebäude. Die Alternative: Bauen Sie separate Module – Küche, Schlafzimmer, Wohnzimmer, jedes mit eigener Verkabelung und Sanitärinstallation. Ungefähr so funktionieren Mikroservices – unabhängige, lose gekoppelte Komponenten, die über das Netzwerk kommunizieren.
\n\nTypeScript für Mikroservices ist nicht nur ein modischer Trend, sondern ein Werkzeug, das vor Chaos bewahrt. Die statische Typisierung fängt Fehler bereits zur Kompilierzeit ab, nicht erst in der Produktion. In diesem Artikel schlüsseln wir auf, wie Sie beginnen, wenn Sie von einem Monolithen zu Mikroservices mit TypeScript wechseln möchten. Ohne überflüssige Ausschweifungen, mit echten Codebeispielen.
\n\nWarum TypeScript und nicht reines JavaScript?
\n\nWenn Sie Mikroservices schreiben, ist jeder Service ein separates Projekt. Ohne Typen verliert man leicht den Überblick: Welches Datenformat erwartet Service A, was gibt Service B zurück? TypeScript löst dieses Problem:
\n\n- \n
- Schnittstellen und Typen – Sie definieren klar die Verträge zwischen den Services. \n
- Autovervollständigung und Refactoring – Die IDE schlägt Objektfelder vor, und Umbenennungen zerstören den Code nicht. \n
- Kompatibilität mit Node.js – TypeScript wird zu JavaScript kompiliert und funktioniert überall, wo Node läuft. \n
Beispiel: Stellen Sie sich vor, der Bestellservice sendet Daten an den Lieferservice. Ohne Typen könnten Sie versehentlich einen String anstelle einer Zahl übergeben. TypeScript sagt dann: „Hey, hier wird ein number erwartet, aber du schickst einen string“.
\n\nWerkzeuge für den Start
\n\nUm zu beginnen, benötigen Sie:
\n\n- \n
- Node.js (Version 18+) – die Laufzeitumgebung. \n
- TypeScript – global oder im Projekt installieren. \n
- NestJS – ein Framework für Serveranwendungen. Es unterstützt von Haus aus die Mikroservice-Architektur. \n
- RabbitMQ oder NATS – Message Broker für die asynchrone Kommunikation. \n
- Docker – Containerisierung jedes Services. \n
Keine Sorge, das alles ist in 15 Minuten eingerichtet.
\n\nSchritt 1: Erstellen des ersten Mikroservices mit NestJS
\n\nNestJS ist wie Angular für das Backend. Es verwendet Decorators, Module und Provider. Installieren wir es:
\n\nnpm i -g @nestjs/cli\nnest new user-service\ncd user-service\nnpm install @nestjs/microservices\n\nJetzt verwandeln wir eine normale Anwendung in einen Mikroservice. Öffnen Sie main.ts:
import { NestFactory } from '@nestjs/core';\nimport { MicroserviceOptions, Transport } from '@nestjs/microservices';\nimport { AppModule } from './app.module';\n\nasync function bootstrap() {\n const app = await NestFactory.createMicroservice<MicroserviceOptions>(\n AppModule,\n {\n transport: Transport.TCP, // oder Redis, RabbitMQ\n options: {\n host: '0.0.0.0',\n port: 3001,\n },\n },\n );\n await app.listen();\n console.log('User microservice is listening on port 3001');\n}\nbootstrap();\n\nWir haben einen Mikroservice erstellt, der auf TCP-Port 3001 lauscht. Jetzt fügen wir einen Nachrichtenhandler in app.controller.ts hinzu:
import { Controller } from '@nestjs/common';\nimport { MessagePattern, Payload } from '@nestjs/microservices';\n\n@Controller()\nexport class AppController {\n @MessagePattern('get_user')\n getUser(@Payload() data: { id: number }) {\n // Simulation einer Datenbankabfrage\n return { id: data.id, name: 'Alice', email: 'alice@example.com' };\n }\n}\n\nFertig! Der erste Mikroservice ist bereit. Er empfängt eine Nachricht mit dem Muster get_user und gibt die Benutzerdaten zurück.
Schritt 2: Erstellen eines zweiten Services und Organisation der Kommunikation
\n\nWir erstellen einen weiteren Service – order-service. Er wird Daten vom user-service anfordern.