Microservices mit Claude Code: Node.js Architektur 2026
Microservices ermöglichen unabhängige Skalierung, Team-Autonomie und technologische Flexibilität — aber bringen auch Komplexität. Claude Code kennt Microservices-Muster: Service-Kommunikation, Event-Driven Architecture, API Gateway und Observability.
Service-Struktur und Kommunikation
ServicesSynchron vs. Asynchron
# Prompt: "Entwirf eine Microservices-Architektur für einen E-Commerce-Shop
# mit User, Order, Product und Notification Service"
// Synchrone Kommunikation: REST / gRPC für direkte Anfragen
// order-service/src/client/product.client.ts
import axios from 'axios'
const PRODUCT_SERVICE = process.env.PRODUCT_SERVICE_URL!
export async function getProduct(id: string) {
const { data } = await axios.get(`${PRODUCT_SERVICE}/products/${id}`, {
timeout: 3000, // Kurzes Timeout — Fail Fast
headers: {
'X-Service-Name': 'order-service',
'X-Request-ID': requestContext.id
}
})
return data
}
// Circuit Breaker Pattern (opossum):
import CircuitBreaker from 'opossum'
const breaker = new CircuitBreaker(getProduct, {
timeout: 3000,
errorThresholdPercentage: 50,
resetTimeout: 30000
})
breaker.on('open', () => logger.warn('Product service circuit OPEN'))
breaker.on('halfOpen', () => logger.info('Circuit testing...'))
Event-Driven: RabbitMQ / Kafka
EventsAsynchrone Kommunikation mit Message Bus
# Prompt: "Implementiere Event-Driven Communication mit RabbitMQ
# Order Created Event → Notification + Inventory Services"
// shared/events.ts — Shared Event Types:
interface OrderCreatedEvent {
type: 'ORDER_CREATED'
payload: {
orderId: string
userId: string
items: Array<{ productId: string; quantity: number }>
total: number
createdAt: string
}
}
// order-service: Publisher
await channel.assertExchange('orders', 'topic', { durable: true })
await channel.publish(
'orders',
'order.created',
Buffer.from(JSON.stringify({
type: 'ORDER_CREATED',
payload: { orderId, userId, items, total, createdAt: new Date().toISOString() }
})),
{ persistent: true, messageId: crypto.randomUUID() }
)
// notification-service: Consumer
await channel.assertQueue('notifications.orders', { durable: true })
await channel.bindQueue('notifications.orders', 'orders', 'order.*')
channel.consume('notifications.orders', async (msg) => {
if (!msg) return
const event = JSON.parse(msg.content.toString())
try {
await sendOrderConfirmation(event.payload)
channel.ack(msg)
} catch (error) {
channel.nack(msg, false, false) // → Dead Letter Queue
}
})
Idempotenz-Tipp: Event Consumer MÜSSEN idempotent sein — dieselbe Message kann mehrfach ankommen. Prüfe immer ob das Event bereits verarbeitet wurde (z.B. via Event-ID in Redis/DB), bevor du die Aktion ausführst.
API Gateway mit Express
GatewayZentraler Einstiegspunkt
// api-gateway/src/index.ts — Claude Code konfiguriert:
import { createProxyMiddleware } from 'http-proxy-middleware'
import rateLimit from 'express-rate-limit'
const app = express()
// Rate Limiting
app.use(rateLimit({ windowMs: 60 * 1000, max: 100 }))
// JWT Auth Middleware
app.use('/api', authenticateToken)
// Service Routing
app.use('/api/users', createProxyMiddleware({
target: process.env.USER_SERVICE_URL,
changeOrigin: true,
pathRewrite: { '^/api/users': '' },
on: { error: (err, req, res) => res.status(503).json({ error: 'User service unavailable' }) }
}))
app.use('/api/orders', createProxyMiddleware({
target: process.env.ORDER_SERVICE_URL,
changeOrigin: true,
pathRewrite: { '^/api/orders': '' }
}))
app.use('/api/products', createProxyMiddleware({
target: process.env.PRODUCT_SERVICE_URL,
changeOrigin: true,
pathRewrite: { '^/api/products': '' }
}))
Docker Compose für lokale Entwicklung
DockerAlle Services lokal starten
# docker-compose.yml — Claude Code generiert vollständiges Setup:
version: '3.9'
services:
api-gateway:
build: ./api-gateway
ports: ["3000:3000"]
environment:
USER_SERVICE_URL: http://user-service:3001
ORDER_SERVICE_URL: http://order-service:3002
PRODUCT_SERVICE_URL: http://product-service:3003
user-service:
build: ./user-service
environment:
DATABASE_URL: postgresql://postgres:pass@postgres:5432/users
order-service:
build: ./order-service
environment:
RABBITMQ_URL: amqp://rabbitmq:5672
PRODUCT_SERVICE_URL: http://product-service:3003
rabbitmq:
image: rabbitmq:3-management
ports: ["15672:15672"] # Management UI
postgres:
image: postgres:16
environment:
POSTGRES_PASSWORD: pass
redis:
image: redis:7-alpine # Caching + Rate Limiting
Wann KEINE Microservices: Unter 10 Entwicklern, Early-Stage Produkt, kein klares Domain-Boundary — dann lieber Modularer Monolith. Microservices lösen Skalierungsprobleme, die die meisten Startups noch gar nicht haben.
Architektur-Modul im Kurs
Im Claude Code Mastery Kurs: vollständiges Microservices-Modul mit Service-Kommunikation, Event-Driven Architecture, API Gateway, Distributed Tracing und Production-Deployment.
14 Tage kostenlos testen →