Einleitung: Warum PHP und Microservices?
Lange Zeit wurde PHP ausschließlich mit monolithischen Anwendungen assoziiert – WordPress, Laravel oder Symfony. Modernes PHP (ab Version 7.4 und insbesondere 8.x) hat sich jedoch zu einem leistungsstarken Werkzeug für die Erstellung von Microservice-Architekturen entwickelt. Dank verbesserter Leistung, strenger Typisierung, asynchroner Fähigkeiten (via ReactPHP oder Swoole) und eines ausgereiften Ökosystems ist PHP zu einer vollwertigen Sprache für Microservices geworden.
In diesem Artikel behandeln wir: was Microservices in PHP sind, wie man die Architektur entwirft, welche Technologien verwendet werden, und wir schreiben echte Codebeispiele.
Was ist Microservice-Architektur?
Microservices sind ein Ansatz, bei dem eine Anwendung in kleine, unabhängig bereitstellbare Dienste aufgeteilt wird. Jeder Dienst ist für seine eigene Geschäftsfunktion verantwortlich und kommuniziert mit anderen über das Netzwerk (HTTP/REST, gRPC, Nachrichtenwarteschlangen).
Wichtige Prinzipien von Microservices in PHP
- Unabhängigkeit — jeder Dienst kann in PHP, Node.js oder Go geschrieben sein, aber wir verwenden PHP für alle.
- Daten-Dezentralisierung — jede Datenbank gehört nur zu einem Dienst.
- Orchestrierung vs. Choreografie — die Wahl zwischen zentraler Verwaltung (Kubernetes) und einem ereignisgesteuerten Ansatz.
- Fehlertoleranz — ein ausgefallener Dienst sollte nicht das gesamte System zum Absturz bringen.
Microservice-Architektur in PHP: Von der Theorie zur Praxis
Betrachten wir ein typisches Projekt: einen Online-Shop. Unterteilen wir ihn in Microservices:
- Benutzerdienst — Registrierung, Authentifizierung, Profile.
- Produktdienst — Produktkatalog, Preise, Lagerbestand.
- Bestelldienst — Bestellerstellung, Status.
- Zahlungsdienst — Zahlungsabwicklung.
- Benachrichtigungsdienst — E-Mail/SMS-Benachrichtigungen.
Schritt 1: Entwurf des API-Gateways
API-Gateway — ein einzelner Einstiegspunkt. In PHP kann es mit Slim Framework oder mit Nginx + PHP-FPM implementiert werden. Beispiel eines einfachen Gateways mit Slim 4:
<?php// api-gateway/public/index.phpuse Slim\\Factory\\AppFactory;use Psr\\Http\\Message\\ServerRequestInterface as Request;use Psr\\Http\\Message\\ResponseInterface as Response;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
// Routing to microservices$app->post('/api/orders', function (Request $request, Response $response) { // Forward the request to Order Service $client = new GuzzleHttp\\Client(['base_uri' => 'http://order-service:8080']); $res = $client->post('/orders', [ 'json' => $request->getParsedBody() ]); $response->getBody()->write($res->getBody()); return $response->withStatus($res->getStatusCode());});
$app->run();Schritt 2: Synchrone Interaktion (REST)
Der einfachste Weg sind HTTP-Anfragen zwischen den Diensten. Verwenden Sie Guzzle oder Symfony HttpClient. Beispiel eines Produktdienstes:
<?php// product-service/src/Controller/ProductController.phpnamespace App\\Controller;
use Symfony\\Component\\HttpFoundation\\JsonResponse;use Symfony\\Component\\HttpFoundation\\Request;
class ProductController{ public function getProduct(int $id): JsonResponse { // Logic for retrieving product from DB $product = $this->productRepository->find($id); if (!$product) { return new JsonResponse(['error' => 'Product not found'], 404); } return new JsonResponse([ 'id' => $product->getId(), 'name' => $product->getName(), 'price' => $product->getPrice() ]); }}