Introduction : Pourquoi PHP et les microservices ?
Longtemps, PHP a été associé exclusivement aux applications monolithiques — WordPress, Laravel ou Symfony. Cependant, le PHP moderne (à partir de la version 7.4 et surtout 8.x) est devenu un outil puissant pour construire une architecture de microservices. Grâce à des performances améliorées, un typage strict, des capacités asynchrones (via ReactPHP ou Swoole) et un écosystème mature, PHP est devenu un langage à part entière pour les microservices.
Dans cet article, nous allons voir : ce que sont les microservices en PHP, comment concevoir l'architecture, quelles technologies utiliser, et écrire des exemples de code concrets.
Qu'est-ce que l'architecture microservices ?
Les microservices sont une approche où l'application est divisée en petits services déployés indépendamment. Chaque service est responsable de sa propre fonction métier et communique avec les autres via le réseau (HTTP/REST, gRPC, files de messages).
Principes clés des microservices en PHP
- Indépendance — chaque service peut être écrit en PHP, Node.js ou Go, mais nous utilisons PHP pour tous.
- Décentralisation des données — chaque base de données appartient à un seul service.
- Orchestration vs Chorégraphie — choix entre une gestion centralisée (Kubernetes) et une approche orientée événements.
- Tolérance aux pannes — un service défaillant ne doit pas casser tout le système.
Architecture des microservices en PHP : de la théorie à la pratique
Considérons un projet typique : une boutique en ligne. Décomposons-le en microservices :
- User Service — inscription, authentification, profils.
- Product Service — catalogue de produits, prix, stocks.
- Order Service — création de commandes, statuts.
- Payment Service — traitement des paiements.
- Notification Service — notifications par email/SMS.
Étape 1 : Conception de l'API Gateway
L'API Gateway est un point d'entrée unique. En PHP, on peut l'implémenter avec Slim Framework ou via Nginx + PHP-FPM. Exemple de gateway simple avec 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();
// Routage vers les microservices$app->post('/api/orders', function (Request $request, Response $response) { // Rediriger la requête vers 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();Étape 2 : Interaction synchrone (REST)
La méthode la plus simple consiste à utiliser des requêtes HTTP entre les services. On utilise Guzzle ou Symfony HttpClient. Exemple de Product Service :
<?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 { // Logique de récupération du produit depuis la base de données $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() ]); }}