Hasina Razafintsalama

Hasina RAZAFINTSALAMA

← Retour au Blog
Architecture

Migrer un monolithe Laravel vers des microservices

Une approche pas à pas pour découper un monolithe Laravel,sans tout faire tomber. Du strangler fig pattern à la définition des frontières de services.

2026-06-10·9 min

Migrer un monolithe vers des microservices est l'une des décisions les plus complexes qu'une équipe tech puisse prendre. Bien exécutée, elle débloque la scalabilité et l'autonomie des équipes. Mal exécutée, elle crée un monolithe distribué,avec toute la complexité des microservices et aucun des bénéfices.

Commencer par le strangler fig pattern

Le strangler fig pattern est la stratégie de migration la plus sûre : au lieu d'une réécriture complète, on extrait progressivement des fonctionnalités du monolithe vers de nouveaux services. Le monolithe continue de tourner pendant qu'on route le trafic vers les nouveaux services, morceau par morceau.

Ne jamais tenter une réécriture complète d'un monolithe en production. Extraire un domaine à la fois, garder le monolithe comme fallback, et migrer le trafic progressivement avec des feature flags.

Identifier les frontières de domaine d'abord

La partie la plus difficile n'est pas le code,c'est de définir les bonnes frontières de services. Utiliser le Domain-Driven Design (DDD) pour identifier les bounded contexts. Chaque microservice doit posséder ses données et exposer un contrat API clair.

  • Cartographier le domaine : identifier les agrégats et les bounded contexts
  • Repérer les points de douleur : quels modules déploient ensemble ? Lesquels se ralentissent mutuellement ?
  • Définir la propriété des données : chaque service doit posséder sa propre base de données
  • Documenter les contrats API avant d'écrire la moindre ligne de code de service

Étapes pratiques avec Laravel

php
// 1. Extraire la logique métier dans un service standalone
// Avant : OrderController dans le monolithe appelle UserService directement
class OrderController extends Controller {
    public function store(Request $request, UserService $users) {
        $user = $users->find($request->user_id); // couplage direct
        // ...
    }
}

// Après : OrderService appelle UserService via HTTP
class OrderService {
    public function createOrder(int $userId, array $items): Order {
        $user = Http::get(config('services.user.url') . '/users/' . $userId)->json();
        // ...
    }
}

Communication : synchrone vs asynchrone

Toutes les communications entre services ne doivent pas être synchrones. Utiliser des appels synchrones pour les opérations nécessitant une réponse immédiate (auth, paiement). Utiliser la messagerie async (RabbitMQ, Kafka) pour les événements qui ne bloquent pas le flux utilisateur (notifications email, logs d'audit, analytics).

Une migration microservices se mesure en mois, pas en semaines. Avancer méthodiquement, mesurer les résultats à chaque étape, et ne pas hésiter à consolider avant de passer à la prochaine extraction.

Besoin d'aide sur ce sujet ? Migration Microservices

Découvrir ce service