Service Mesh und PHP: Wie Mikroservices intelligenter werden

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

Ihre PHP-Mikroservices flüstern sich etwas zu? Zeit, die Freisprecheinrichtung einzuschalten

\n\n

Stellen Sie sich vor: Sie haben 15 PHP-Mikroservices. Einer ist für die Autorisierung zuständig, ein anderer für Zahlungen, ein dritter für Benachrichtigungen. Sie kommunizieren über HTTP, aber jede Woche geht etwas kaputt: Timeouts, Abstürze, verlorene Anfragen. Sie fügen Retries, Circuit Breaker, Lastverteilung hinzu – und der Code verwandelt sich in Spaghetti aus Netzwerklogik.

\n\n

Hier kommt Service Mesh ins Spiel – eine Infrastrukturschicht, die die gesamte Netzwerk-Magie aus Ihrem PHP-Code auslagert. Keine Angst: Das ist keine Magie, sondern eine durchdachte Architektur. Und ja, PHP-Mikroservices können (und sollten) Service Mesh verwenden.

\n\n

Was ist Service Mesh und warum braucht ein PHP-Entwickler es?

\n\n

Service Mesh ist eine dedizierte Infrastrukturebene zur Verwaltung der Kommunikation zwischen Diensten. Anstatt in jedem Mikroservice Logik für Lastverteilung, Verschlüsselung, Tracing und Timeouts zu schreiben, delegieren Sie dies an einen Sidecar-Proxy (normalerweise Envoy oder Linkerd).

\n\n

Für PHP ist dies besonders relevant, weil:

\n
    \n
  • PHP-Anwendungen oft über FastCGI oder FPM laufen und das Hinzufügen von Netzwerklogik in jeden Dienst ein Overhead ist
  • \n
  • Service Mesh mTLS (gegenseitige Authentifizierung) ohne Codeänderungen bietet
  • \n
  • Sie ein einheitliches Dashboard zur Überwachung aller Mikroservices erhalten
  • \n
  • Sie Circuit Breaker und Retry direkt auf Proxy-Ebene implementieren können
  • \n
\n\n

Der beliebteste Stack ist Istio + Envoy. Aber wir betrachten ihn aus der Perspektive eines PHP-Entwicklers.

\n\n

Wie es funktioniert: PHP-Dienst + Sidecar

\n\n

Angenommen, Sie haben einen Mikroservice user-service in PHP. Er hört auf Port 9000 (FPM). Ohne Service Mesh greifen Sie direkt darauf zu:

\n\n
GET http://user-service:9000/api/users/1
\n\n

Mit Service Mesh wird Ihrem Pod (Container) ein Envoy-Proxy hinzugefügt. Nun läuft der gesamte eingehende und ausgehende Datenverkehr durch ihn:

\n\n
┌─────────────────┐       ┌──────────────┐\n│ PHP-Anwendung    │ ──►   │ Envoy Proxy  │\n│ (user-service)   │       │ (sidecar)    │\n└─────────────────┘       └──────┬───────┘\n                                  │\n                                  ▼\n                          ┌──────────────┐\n                          │ Envoy Proxy  │\n                          │ (anderer Dienst)│\n                          └──────────────┘
\n\n

Ihr PHP-Code weiß nichts vom Proxy. Er sendet einfach Anfragen an localhost:80 oder localhost:9000 – Envoy fängt sie ab und routet sie gemäß den Istio-Regeln.

\n\n

Praktisches Beispiel: PHP-Mikroservice mit Service Mesh auf Istio

\n\n

Schritt 1. Einrichtung des PHP-Dienstes (ohne Codeänderungen)

\n\n

Angenommen, Sie haben ein einfaches PHP-Skript, das Benutzerdaten zurückgibt:

\n\n
<?php\n// user-service/index.php\n$userId = $_GET['id'] ?? 0;\n$users = [\n    1 => ['name' => 'Alice', 'email' => 'alice@example.com'],\n    2 => ['name' => 'Bob', 'email' => 'bob@example.com'],\n];\n\nheader('Content-Type: application/json');\necho json_encode($users[$userId] ?? ['error' => 'User not found']);
\n\n

Packen Sie es in Docker:

\n\n
# Dockerfile\nFROM php:8.2-fpm\nCOPY index.php /var/www/html/index.php\nCMD ["php-fpm"]
\n\n

Alles Standard. Keine Änderungen für Service Mesh.

\n\n

Schritt 2. Deployment mit Sidecar in Kubernetes

\n\n

Fügen Sie die Annotation sidecar.istio.io/inject: "true" hinzu – Istio fügt Envoy automatisch ein:

\n\n
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: user-service\nspec:\n  replicas: 2\n  selector:\n    matchLabels:\n      app: user-service\n  template:\n    metadata:\n      labels:\n        app: user-service\n      annotations:\n        sidecar.istio.io/inject: "true"  # <-- Schlüsselzeile\n    spec:\n      containers:\n      - name: php\n                

Blogs

Buchempfehlungen