Concevoir des systèmes d’information comme un réseau de services autonomes, interopérables et réutilisables — gouvernés par des contrats formels.
01
La Métaphore
🏛️
La Ville et ses Administrations
Imagine une ville avec ses services publics : la mairie, la bibliothèque, la poste, la banque, l’hôpital. Chaque institution est autonome, a ses propres règles internes, mais elles communiquent toutes via un langage commun — formulaires standardisés, protocoles officiels.
Quand tu veux construire une maison, tu passes par un guichet central (l’ESB) qui contacte le cadastre, la mairie, le fisc. Chaque service répond avec un contrat formel (WSDL ou OpenAPI). Tu reçois une réponse consolidée. C’est exactement ce qu’est la SOA.
La Service-Oriented Architecture est un style architectural apparu dans les années 2000 pour répondre à un problème massif dans les grandes entreprises : des dizaines de systèmes hétérogènes (ERP, CRM, legacy COBOL, partenaires B2B) incapables de se parler.
L’idée fondatrice : décomposer l’application en services métier indépendants, chacun exposant une interface publique formelle (son contrat), communicant via un bus central (l’ESB — Enterprise Service Bus) qui prend en charge le routage, la transformation de messages, la sécurité et le monitoring de manière transversale.
02
Vue d’ensemble
Une architecture SOA typique s’articule autour de trois zones : les consommateurs (clients qui appellent les services), l’ESB (le bus qui centralise la communication), et les services métier (les unités autonomes de logique).
Règle fondamentale : tout consommateur communique exclusivement via l’ESB. Il ne connaît jamais l’adresse réseau réelle d’un service — seulement son nom de contrat. L’ESB résout, route et transforme de manière transparente.
03
Le Triangle SOA — Publish / Find / Bind
Le modèle d’interaction canonique en SOA repose sur trois acteurs et trois opérations. C’est le protocole de découverte de services à la base de toute l’architecture.
Service Provider
Fournisseur
Service Registry
Annuaire UDDI
Service Consumer
Consommateur
1. Publish2. Find3. Bind
Publish — Le fournisseur enregistre son service dans l’annuaire avec son contrat (WSDL ou OpenAPI). Find — Le consommateur interroge l’annuaire pour trouver le service dont il a besoin. Bind — Le consommateur appelle directement le service via le contrat découvert (souvent via l’ESB).
04
Les 8 Principes de Thomas Erl
Thomas Erl a formalisé huit principes fondamentaux qui définissent ce qu’est un vrai service SOA. Un service qui viole l’un de ces principes n’est pas un service — c’est une fonction exposée sur le réseau.
01
Loose Coupling
Les services minimisent leurs dépendances mutuelles. Un service ne connaît que le contrat de l’autre, jamais son implémentation.
02
Service Contract
Chaque service expose un contrat formel et stable — son interface publique. C’est le seul engagement envers l’extérieur.
03
Autonomy
Chaque service contrôle entièrement sa propre logique. Il ne délègue pas à un autre service pour remplir sa propre responsabilité.
04
Abstraction
L’implémentation interne est cachée. Les consommateurs ne voient que ce que le contrat expose — rien de plus.
05
Reusability
Un service est conçu pour être consommé par plusieurs clients. La réutilisation est une priorité de conception, pas un bonus.
06
Composability
Les services peuvent être composés pour former des processus métier plus complexes — l’orchestration en est l’expression.
07
Statelessness
Les services évitent de conserver un état entre les appels. L’état est porté par le client ou externalisé dans un store.
08
Discoverability
Les services sont enregistrés et découvrables via un annuaire. Aucun consommateur ne devrait coder en dur une adresse réseau.
05
Orchestration vs Chorégraphie
En SOA, deux modèles coexistent pour coordonner plusieurs services dans un processus métier. Le choix entre les deux est l’une des décisions d’architecture les plus importantes.
🎼 Orchestration — le Chef d’orchestre
Orchestrateur (ESB / BPEL / Camunda)
1. Commande
2. Paiement
3. Livraison
✓ Flux visible et facile à monitorer ✓ Rollback / compensation centralisés ✗ Point de défaillance unique (SPOF) ✗ Couplage fort à l’orchestrateur
Outils : BPEL, Camunda, Activiti, Apache Camel
💃 Chorégraphie — la Danse collective
Event Bus (Kafka / RabbitMQ)
Svc Commande émet: order.created
Svc Paiement réagit: order.created
Svc Livraison réagit: payment.ok
Svc Notif réagit: any event
✓ Pas de SPOF — très résilient ✓ Services totalement découplés ✗ Flux implicite, difficile à déboguer ✗ Cohérence éventuelle complexe
Outils : Kafka, RabbitMQ, AWS EventBridge
Piège classique : l’orchestration centralisée dans l’ESB crée souvent un monolithe distribué. La logique métier migre progressivement dans l’ESB au lieu de rester dans les services — résultat : l’ESB devient le vrai système, et les services des façades vides.
06
Le Contrat de Service
En SOA, le contrat est roi. Avant d’écrire une ligne d’implémentation, on définit l’interface publique. C’est l’équivalent moderne du WSDL — et c’est le seul point de couplage autorisé entre services.
Chaque service implémente son contrat de manière autonome. L’implémentation est un détail — le contrat est la vérité. NestJS facilite cette approche grâce à l’injection de dépendances et aux décorateurs.
L’ESB est le cœur de la SOA. Pour comprendre ce qu’il fait, voici un ESB maison en TypeScript qui implémente les responsabilités essentielles : enregistrement, routage, middleware pipeline (logging, auth, retry).
C’est le pattern Chain of Responsibility de GoF appliqué au bus de services.
Dans un système distribué, les transactions ACID n’existent plus. Le pattern Saga remplace la transaction globale par une séquence d’étapes locales, chacune associée à une compensation en cas d’échec — l’équivalent d’un ROLLBACK distribué.
La SOA n’est pas réservée à la POO. En programmation fonctionnelle, un service est simplement une fonction pureInput → TaskEither<Error, Output>. La composition de services devient alors un pipeline explicite via pipe et chain.
La bibliothèque fp-ts apporte les monades TaskEither et Either qui encodent les deux cas — succès et échec — dans le type lui-même. Plus de try/catch implicites.
Avantage clé : dans l’approche fonctionnelle, l’erreur est un citoyen de première classe du type. Le compilateur TypeScript te force à gérer les deux cas. Il est impossible d’oublier un cas d’échec — contrairement aux try/catch où l’oubli passe silencieusement à la compilation.
11
SOA vs Microservices
La confusion entre SOA et Microservices est omniprésente. La vérité : les Microservices sont une évolution de la SOA, nés du besoin de déploiements indépendants et de l’essor du Cloud. Ils partagent les mêmes principes fondamentaux, mais s’opposent radicalement sur l’implémentation.
Critère
SOA (2000–2010)
Microservices (2010–aujourd’hui)
Granularité
Services métier larges (Order, Customer…)
Services ultra-granulaires (1 fonction = 1 service)
Communication
ESB central — SOAP/XML, WS-*
Direct — REST, gRPC, Events (Kafka)
Déploiement
Souvent déployé en groupe (plusieurs services/serveur)
Conteneur indépendant (Docker + K8s)
Données
Base de données souvent partagée
Database-per-service (idéal)
Gouvernance
Centralisée — IT/Enterprise driven
Equipe autonome — Team owned
Contrat
WSDL / UDDI formels
OpenAPI / AsyncAPI
Cible
Intégration Enterprise (EAI)
Applications Cloud-native
Failure mode
SPOF potentiel sur l’ESB
Défaillance partielle, circuit breaker
🏢
La métaphore finale
La SOA est une grande entreprise structurée avec des départements bien définis et un secrétariat central (l’ESB) qui filtre toute communication. Les Microservices sont une startup agile où chaque petite équipe autonome livre directement, sans passer par la hiérarchie. Les deux sont valides — ça dépend de ton contexte, de ta maturité organisationnelle et de tes contraintes de déploiement.
12
Quand utiliser la SOA ?
✓ Utilise la SOA quand…
Tu dois intégrer des systèmes hétérogènes existants (ERP, CRM, legacy, partenaires B2B)
Tu as besoin d’une gouvernance forte et de contrats formels (finance, santé, gouvernement)
La réutilisation de services entre plusieurs applications est un objectif stratégique
Tu travailles dans un contexte Enterprise avec des équipes IT centralisées
Les protocoles de sécurité standardisés (WS-Security, SAML) sont requis
✗ Évite la SOA quand…
Tu construis une startup — l’overhead d’un ESB est fatal à la vélocité
Tu veux un déploiement indépendant par feature team → préfère les Microservices
Ton système est simple — un bon Monolithe Modulaire est plus efficace et moins coûteux
Tu as besoin d’une latence ultra-faible — l’ESB ajoute des sauts réseau
Ton équipe n’a pas la maturité opérationnelle pour maintenir un ESB en production
Règle de Rob Martin appliquée à la SOA : chaque service doit avoir une seule raison de changer — son domaine métier. Si un service change parce que l’ESB change, ou parce que la base de données change, la SOA a échoué. Le Principe de Responsabilité Unique s’applique à l’échelle de l’architecture, pas seulement du code.