M
M
Dédicace
Je rends grâce, avant toute chose, à Allah, le Tout-Puissant, de m’avoir accordé la force, le
courage et la persévérance nécessaires pour accomplir ce parcours universitaire et mener ce
mémoire à son terme.
Je dédie ce travail à mon cher père, dont l’amour, les valeurs, les conseils et le soutien ont
toujours été une source de motivation. Sa confiance en moi et ses encouragements constants
m’ont inspirée à persévérer et à donner le meilleur de moi-même.
À ma très chère mère, j’adresse ma plus profonde gratitude pour son amour inconditionnel,
ses innombrables sacrifices, ses prières et son soutien indéfectible. Sa bienveillance, sa
patience et ses encouragements m’ont permis de surmonter les difficultés et de poursuivre
mes ambitions avec détermination.
À ma sœur Yasmine, pour son affection, sa présence, son soutien moral et ses
encouragements qui m’ont accompagnée tout au long de cette aventure académique.
J’exprime ma profonde reconnaissance à mon encadrant, Monsieur Driss Riane, pour son
accompagnement, sa disponibilité, ses conseils avisés, sa patience et son soutien tout au long
de la réalisation de ce projet de fin d’études.
Enfin, je remercie chaleureusement toutes les personnes qui, de près ou de loin, ont contribué
à l’aboutissement de ce travail par leurs conseils, leur aide ou leurs encouragements.
À toutes ces personnes, je dédie ce modeste travail avec un profond respect, une immense
gratitude et toute mon affection.
ii
Introduction Générale
Remerciements
Avant toute chose, je rends grâce à Allah, le Tout-Puissant, qui m’a accordé la force, la
patience et la persévérance nécessaires pour mener ce travail à son terme. Je Le remercie pour
les nombreuses bénédictions dont Il m’a comblée tout au long de mon parcours académique.
J’adresse mes plus sincères remerciements à mes encadrants, Monsieur Driss Riane,
Madame la Professeure Soumia ZITI, Madame la Doctorante Maha ZERROUG,
Monsieur le Doctorant TAIAR Abdellah et Monsieur le Doctorant Marouane Achbari,
pour leur disponibilité, leur accompagnement, leurs précieux conseils et leur soutien constant.
Leurs orientations, leur rigueur scientifique, leur bienveillance et leurs remarques pertinentes
ont constitué une aide précieuse et ont largement contribué à la réussite de ce projet de fin
d'études.
Je tiens également à remercier toutes les personnes qui, de près ou de loin, m’ont apporté leur
soutien, leurs encouragements ou leur aide tout au long de cette expérience. Leur présence et
leur confiance ont été une source de motivation tout au long de ce parcours.
J’exprime enfin ma profonde gratitude aux membres du jury qui ont accepté d’évaluer ce
mémoire. Je les remercie très sincèrement pour le temps qu’ils consacrent à l’examen de ce
travail, ainsi que pour l’intérêt qu’ils lui portent et les remarques constructives qu’ils ne
manqueront pas d’apporter.
iii
Introduction Générale
Résumé
Mots clés : Architecture microservices, Load Balancer intelligent, API Gateway, NGINX,
Docker, PostgreSQL, Service Discovery, Health Check, JWT, Scalabilité, Haute disponibilité.
iv
Introduction Générale
Abstract
Modern information systems require scalable and highly available architectures capable of
handling increasing workloads and service demands. Microservices architecture has emerged
as a popular solution due to its modularity, flexibility and independent deployment
capabilities. Nevertheless, managing multiple services introduces challenges related to traffic
distribution, fault tolerance and service availability. This project focuses on the design and
implementation of a Load Balancer solution within a microservices architecture. The
developed platform consists of several specialized microservices including Authentication
Service, User Service, Order Service and Payment Service. These services are exposed
through a centralized API Gateway and deployed using Docker containers. An NGINX-based
Load Balancer dynamically distributes incoming requests across multiple service instances,
improving system performance and fault tolerance.
In addition to load balancing, the proposed system ensures better scalability by allowing
horizontal scaling of microservices according to demand. Each service operates
independently, which reduces interdependencies and improves maintainability of the overall
system. The use of containerization with Docker ensures consistent deployment across
different environments and simplifies system orchestration. Furthermore, the API Gateway
plays a key role in securing and managing client requests efficiently. Monitoring mechanisms
also provide better visibility into system behavior and help detect failures in real time.
Additional mechanisms such as Service Discovery, Health Checks, centralized logging and
JWT authentication have been integrated to ensure reliability, observability and security.
v
Introduction Générale
Structure du rapport
Ce rapport est structuré de manière progressive afin de présenter les différentes étapes de
conception, de développement et de validation de la solution proposée. Il débute par un
premier chapitre consacré au cadre général du projet, dans lequel sont présentés le contexte de
l’étude, la problématique rencontrée ainsi que les objectifs visés par la mise en place d’un
mécanisme de load balancing intelligent au sein d’une architecture microservices.
Enfin, ce rapport s’achève par une conclusion générale qui récapitule les
principaux résultats obtenus, les apports du projet, ses limites éventuelles ainsi
que les perspectives d’amélioration et d’évolution futures de la solution
développée.
vi
Introduction Générale
Dédicace.....................................................................................................................................
Remerciements.........................................................................................................................
Résumé......................................................................................................................................
Abstract......................................................................................................................................
Structure du rapport...............................................................................................................
Table des matières...................................................................................................................
Liste des figures........................................................................................................................
Liste des Abréviations.............................................................................................................
Introduction Générale..........................................................................................................
Chapitre 1 : Contexte général du projet...............................................................................
Introduction......................................................................................................................
1.1. Contexte du projet.....................................................................................................
1.1.1. Présentation du projet........................................................................................
1.1.2. Objectif du projet...............................................................................................
Objectifs Techniques....................................................................................................
Objectifs Scientifiques et Pédagogiques.....................................................................
1.1.3. Solution proposée................................................................................................
1.1.4. Diagramme de GANTT......................................................................................
1.2. Organisation du Rapport..........................................................................................
Conclusion.........................................................................................................................
Chapitre 2 : Contexte théorique et état de l’art....................................................................
Introduction......................................................................................................................
2.1. Architecture monolithique........................................................................................
2.2. Architecture microservices.....................................................................................
2.3. API Gateway............................................................................................................
2.4. Load Balancer..........................................................................................................
2.4.1. Définition et objectifs........................................................................................
vii
Introduction Générale
viii
Introduction Générale
ix
Introduction Générale
x
Introduction Générale
xi
Introduction Générale
Abréviation Signification
API Application Programming Interface
REST Representational State Transfer
HTTP HyperText Transfer Protocol
HTTPS HyperText Transfer Protocol Secure
JWT JSON Web Token
UI User Interface
UML Unified Modeling Language
CPU Central Processing Unit (Unité centrale de traitement)
RAM Random Access Memory (Mémoire vive)
DB Database (Base de données)
CRUD Create, Read, Update, Delete
LB Load Balancer
RR Round Robin
WRR Weighted Round Robin
LC Least Connections
API GW API Gateway
SD Service Discovery
HC Health Check
MS Microservice
SLA Service Level Agreement
QoS Quality of Service
JSON JavaScript Object Notation
Docker Plateforme de conteneurisation
[Link] Environnement d’exécution JavaScript côté serveur
NPM Node Package Manager
CORS Cross-Origin Resource Sharing
CI/CD Continuous Integration / Continuous Deployment
Log Journal des événements système
xii
Introduction Générale
Abréviation Signification
KPI Key Performance Indicator (Indicateur clé de performance)
HA High Availability (Haute disponibilité)
xiii
Introduction Générale
Introduction Générale
Cependant, malgré les nombreux avantages qu’elles offrent, les architectures microservices
introduisent également de nouveaux défis techniques. Parmi les plus importants figurent la
gestion du trafic réseau, la répartition des requêtes entre les différentes instances de services,
la tolérance aux pannes ainsi que le maintien d’une haute disponibilité. Lorsqu’un grand
nombre d’utilisateurs accède simultanément à l’application, certains services peuvent être
surchargés, entraînant une dégradation des performances et une augmentation du temps de
réponse.
Afin de répondre à ces problématiques, les mécanismes de load balancing jouent un rôle
essentiel dans les architectures distribuées. Leur objectif est de répartir efficacement les
requêtes entre plusieurs instances de services afin d’optimiser l’utilisation des ressources
disponibles, d’améliorer les performances globales du système et d’assurer une continuité de
service même en cas de défaillance d’un composant.
C’est dans ce cadre que s’inscrit ce projet de fin d’études, dont l’objectif principal est la
conception et le développement d’un Load Balancer Intelligent pour une Architecture
Microservices. La solution proposée repose sur l’intégration d’une API Gateway, d’un
mécanisme de Service Discovery, d’un système de Health Check ainsi que d’un tableau de
bord de supervision permettant de surveiller l’état des différents services en temps réel.
1
Introduction Générale
pannes et garantir une meilleure expérience utilisateur dans un environnement
distribué et évolutif.
2
Chapitre4 : Présentation de l’application finale
3
Chapitre4 : Présentation de l’application finale
Introduction
L'évolution rapide du développement logiciel et l'essor du cloud computing ont
profondément transformé la manière dont les applications modernes sont conçues,
déployées et exploitées. Face aux exigences croissantes de scalabilité, de résilience
et de disponibilité, les architectures monolithiques traditionnelles se révèlent de
plus en plus inadaptées aux besoins des systèmes d'information contemporains.
C'est dans ce cadre que s'inscrit le présent projet de fin d'études, qui vise à
concevoir et implémenter un Load Balancer Intelligent pour une architecture
microservices complète. L'objectif central est de développer un système capable de
distribuer intelligemment le trafic entrant entre plusieurs instances de services, en
s'adaptant dynamiquement à l'état réel du système et en garantissant une haute
disponibilité.
Auth Service (Port 3001) : service d'authentification gérant l'inscription des utilisateurs,
la connexion sécurisée avec JWT (JSON Web Token), le hachage des mots de passe
avec bcrypt et la vérification des tokens.
Users Service (Port 3002) : service de gestion des utilisateurs assurant les opérations
CRUD (Create, Read, Update, Delete) sur les entités utilisateur, avec persistance dans
une base de données PostgreSQL.
4
Chapitre4 : Présentation de l’application finale
Orders Service (Port 3003) : service de gestion des commandes permettant la création,
le suivi et la mise à jour du statut des commandes tout au long de leur cycle de vie.
Payment Service (Port 3004) : service de traitement des paiements gérant le traitement
des transactions, le suivi des statuts et les opérations de remboursement.
API Gateway (Port 3000) : composant central intégrant le Load Balancer Intelligent,
assurant le routage dynamique des requêtes vers les services backend via le Service
Registry.
Frontend Dashboard (Port 3500) : interface web de monitoring affichant en temps réel
l'état des services, les statistiques du load balancer et les logs des requêtes.
Objectifs Techniques
1. Développer une architecture microservices complète et fonctionnelle, composée de cinq
services métier [Link]/Express interconnectés via une API Gateway centrale.
2. Implémenter un Load Balancer multi-stratégies supportant quatre algorithmes de
distribution : Round Robin, Least Connections, Weighted Round Robin et IP Hash, avec
capacité de changement de stratégie à chaud sans redémarrage des services.
3. Mettre en place un Service Registry avec health checks automatiques périodiques
(toutes les 30 secondes), permettant la détection et l'exclusion automatique des instances
défaillantes.
5
Chapitre4 : Présentation de l’application finale
Face aux défis liés à la répartition de charge dans les architectures microservices, la solution
proposée repose sur une architecture multicouche intégrant un load balancer applicatif
intelligent et une infrastructure entièrement conteneurisée avec Docker. Les requêtes transitent
d’abord par Nginx, qui assure la répartition du trafic externe, avant d’être redirigées vers une
API Gateway intégrant un load balancer interne chargé de distribuer les requêtes entre les
différentes instances des services métier (authentification, utilisateurs, commandes et
paiements). Ce load balancer, implémenté selon le patron Singleton, prend en charge plusieurs
stratégies de répartition (Round Robin, Least Connections, Weighted Round Robin et IP Hash)
et permet de changer dynamiquement d’algorithme sans interruption de service. L’ensemble de
la plateforme est déployé avec Docker Compose et s’appuie sur PostgreSQL, un réseau Docker
dédié et des volumes persistants, garantissant un déploiement reproductible, une bonne
isolation des services et une infrastructure fiable et facilement maintenable.
6
Chapitre4 : Présentation de l’application finale
7
Chapitre4 : Présentation de l’application finale
Conclusion
Les objectifs ont été clairement définis : ils couvrent à la fois la dimension
technique (implémentation du Load Balancer multi-stratégies, architecture
complète, déploiement Docker) et la dimension scientifique (analyse comparative
des algorithmes, maîtrise des systèmes distribués). La solution proposée, articulée
autour d'un load balancer applicatif intégré et d'une infrastructure Docker complète
avec PostgreSQL, répond directement à ces objectifs.
8
Chapitre4 : Présentation de l’application finale
Chapitre 2 : Contexte
théorique et état de l’art
9
Chapitre4 : Présentation de l’application finale
Introduction
Une application monolithique est une application dont tous les composants —
interface utilisateur, logique métier et couche d'accès aux données — sont
regroupés dans un seul et même déployable. Pendant longtemps, ce modèle a
constitué la norme dans le développement logiciel.
Ses avantages sont réels pour des projets de petite taille : simplicité de
développement, de tests et de déploiement, transactions locales plus faciles à gérer,
et absence de communication réseau entre les composants internes. Cependant, à
mesure que l'application grandit, ses inconvénients deviennent progressivement
rédhibitoires :
10
Chapitre4 : Présentation de l’application finale
Selon Martin Fowler et James Lewis (2014), une architecture microservices est
constituée d'un ensemble de services indépendants, chacun responsable d'une
capacité métier spécifique et pouvant être développé, déployé et mis à l'échelle de
manière autonome [12].
Chris Richardson (2018) souligne que l'API Gateway simplifie les échanges entre
les clients et les microservices en centralisant le routage, l'authentification, la
sécurité et les traitements transversaux [13].
11
Chapitre4 : Présentation de l’application finale
Le load balancing (équilibrage de charge) est le processus par lequel les requêtes
entrantes sont distribuées entre plusieurs instances d'un même service, avec pour
objectifs :
Dans notre projet, nous utilisons Nginx — un des serveurs web et reverse proxies
les plus répandus — en tant que load balancer de niveau L7. Nginx est reconnu
pour ses performances élevées, sa faible consommation mémoire et sa capacité à
gérer des milliers de connexions simultanées grâce à son architecture
événementielle non-bloquante.
12
Chapitre4 : Présentation de l’application finale
Notre fichier `[Link]` configure Nginx pour distribuer le trafic vers l'API
Gateway, transmettre les en-têtes d'origine du client (`X-Real-IP`, `X-Forwarded-
For`) et servir de façade unifiée sur le port 8080
Cette configuration, bien que pointant vers une seule instance de l'API Gateway, est
conçue pour être étendue à plusieurs instances sans modification du code applicatif,
illustrant ainsi le principe d'infrastructure as code.
Les principaux algorithmes de load balancing utilisés dans les architectures microservices sont
les suivants :
Round Robin : distribue les requêtes de manière séquentielle entre les différentes
instances de service. Cet algorithme est simple à mettre en œuvre et convient aux
environnements où les serveurs disposent de capacités similaires.
Weighted Round Robin : fonctionne sur le même principe que le Round Robin,
mais attribue un poids à chaque serveur en fonction de sa capacité de traitement. Les
serveurs les plus performants reçoivent ainsi un plus grand nombre de requêtes.
Least Connections : dirige chaque nouvelle requête vers le serveur ayant le plus
faible nombre de connexions actives. Cette approche permet une meilleure
répartition de la charge lorsque les temps de traitement des requêtes sont variables.
Weighted Least Connections : améliore l'algorithme Least Connections en tenant
compte à la fois du nombre de connexions actives et de la capacité de chaque
serveur, offrant ainsi une distribution plus équilibrée dans les environnements
hétérogènes.
IP Hash : sélectionne le serveur de destination à partir d'une fonction de hachage
appliquée à l'adresse IP du client. Cette méthode garantit qu'un même utilisateur est
généralement redirigé vers la même instance, ce qui favorise la persistance des
sessions.
13
Chapitre4 : Présentation de l’application finale
14
Chapitre4 : Présentation de l’application finale
instances de chaque service. Elle expose des méthodes pour enregistrer un service,
récupérer la liste des instances d'un service, effectuer un health check, et
désenregistrer un service.
Un health check est une vérification périodique effectuée pour déterminer si une
instance de service est en mesure de traiter des requêtes. Un service peut être dans
plusieurs états : healthy (en bonne santé), degraded (dégradé, répondant mais
lentement) ou unhealthy (en panne).
Chacun de nos microservices expose un endpoint `GET /health` retournant son état,
son uptime et un timestamp. L'API Gateway expose un endpoint agrégé `GET
/health/services` qui interroge en parallèle tous les services (avec un timeout de 3
secondes par service) et retourne un état consolidé :
15
Chapitre4 : Présentation de l’application finale
de ce projet, un système de logging centralisé a été mis en place à travers une classe
Logger, chargée d’enregistrer les événements de chaque service dans des fichiers de
logs dédiés ainsi que dans un fichier global regroupant toutes les requêtes. Les
informations sont stockées au format JSON afin de faciliter leur exploitation par
des outils d’analyse et de supervision. Le système prend en charge plusieurs
niveaux de journalisation (ERROR, WARN, INFO et DEBUG) et un middleware
dédié enregistre automatiquement les principales informations de chaque requête
HTTP, notamment la méthode, le chemin, le code de retour, le temps de traitement,
l’adresse IP du client et le navigateur utilisé. Cette architecture a été conçue pour
être évolutive et compatible avec des solutions industrielles telles que ELK, Loki,
Prometheus ou OpenTelemetry, permettant ainsi d’étendre facilement la plateforme
vers une solution complète de supervision et d’observabilité.
16
Chapitre4 : Présentation de l’application finale
Conclusion
17
Chapitre4 : Présentation de l’application finale
18
Chapitre4 : Présentation de l’application finale
Introduction
Après avoir situé notre projet dans son contexte général et étudié l'état de l'art des
architectures microservices et des mécanismes de load balancing au chapitre
précédent, ce troisième chapitre constitue le cœur de la démarche d'ingénierie. Il
présente l'ensemble du travail de conception qui a précédé le développement du
système.
La conception d'un système distribué tel qu'un Load Balancer Intelligent pour une
architecture microservices requiert une analyse rigoureuse des besoins avant toute
ligne de code. Cette phase est déterminante : elle permet d'identifier précisément les
fonctionnalités attendues, de définir les contraintes de qualité du système et de
poser les bases architecturales sur lesquelles l'implémentation s'appuiera.
19
Chapitre4 : Présentation de l’application finale
Plusieurs problèmes ont été identifiés dans l’architecture existante, ayant des
impacts directs sur les performances et la fiabilité du système. Tout d’abord, la
surcharge d’une instance unique entraîne un goulot d’étranglement, provoquant une
augmentation de la latence et pouvant aller jusqu’à une interruption de service.
Ensuite, l’absence de mécanisme de détection automatique des pannes fait que les
requêtes continuent d’être dirigées vers des instances défaillantes, ce qui dégrade la
disponibilité du système. Par ailleurs, la stratégie de distribution des requêtes est
rigide et ne permet pas de s’adapter dynamiquement en fonction du type ou de la
charge du trafic, limitant ainsi l’efficacité globale de l’architecture. Enfin, le
manque d’observabilité constitue une faiblesse majeure, car il n’existe pas de
visibilité suffisante sur l’état des services ni sur la répartition du trafic, ce qui
complique le diagnostic et la maintenance du système
Les spécifications fonctionnelles décrivent les différentes fonctionnalités que le système doit
offrir. Elles sont organisées selon les principaux domaines fonctionnels de la plateforme.
[Link] de l'authentification
Le système doit permettre l'inscription d'un nouvel utilisateur avec validation des
champs (nom, email, mot de passe) et hachage sécurisé du mot de passe avec bcrypt
(facteur de coût 10).
Le système doit authentifier un utilisateur via son email et son mot de passe, puis
retourner un token JWT signé avec une durée de validité configurable (24 heures par
défaut).
Le système doit valider les tokens JWT sur chaque requête protégée grâce à un
middleware dédié (verifyJWT).
Le système doit permettre la déconnexion en invalidant le token côté client.
20
Chapitre4 : Présentation de l’application finale
Le système doit traiter les demandes de paiement associées aux commandes en prenant
en charge le montant, le mode de paiement et la génération d'un identifiant unique de
transaction.
Le système doit conserver un historique des transactions indexé par identifiant de
commande.
Le système doit permettre le remboursement d'un paiement avec mise à jour du statut de
la transaction.
21
Chapitre4 : Présentation de l’application finale
Le système doit exposer un endpoint GET /health sur chaque microservice afin de
fournir son état, son temps de fonctionnement (uptime) et un horodatage.
Le système doit exposer un endpoint GET /health/services au niveau de l'API Gateway
pour agréger l'état de santé de tous les services.
Le système doit permettre l'enregistrement dynamique de nouvelles instances via POST
/registry/register.
Le système doit permettre la suppression d'une instance via DELETE
/registry/deregister.
Le système doit exécuter automatiquement des contrôles d'état périodiques afin
d'exclure les instances défaillantes de la répartition de charge.
Le système doit enregistrer chaque requête HTTP au format JSON en conservant les
informations essentielles telles que la date, le service, la méthode, le chemin, la durée de
traitement et le code de retour.
Le système doit exposer les statistiques du load balancer (algorithme actif, nombre
d'instances et connexions actives) via GET /lb/stats.
Le système doit fournir un tableau de bord en temps réel affichant l'état des services, les
métriques du load balancer ainsi que les journaux récents.
22
Chapitre4 : Présentation de l’application finale
de maintenir le service même en cas de panne d’une instance. La scalabilité est assurée par
la capacité de déploiement horizontal des services, sans modification du code, grâce au
service registry qui facilite la gestion dynamique des instances. Sur le plan de la sécurité,
l’authentification repose sur des tokens JWT dans un contexte stateless, avec des mots de
passe hachés via bcrypt (coût 10) et des mécanismes de communication sécurisée entre
services. La maintenabilité est garantie par une architecture faiblement couplée où chaque
service est indépendant et peut être modifié ou redéployé séparément, avec du code
mutualisé dans un répertoire shared/. En matière de portabilité, chaque service est
conteneurisé avec Docker et orchestré via Docker Compose, permettant un déploiement
simplifié et reproductible. L’observabilité est assurée par des logs structurés en JSON
compatibles avec des outils comme ELK ou Datadog, complétés par des health checks
réguliers effectués toutes les 30 secondes. Enfin, la résilience du système repose sur un
mécanisme d’auto-failover capable de détecter les instances défaillantes en moins de 30
secondes et de les exclure automatiquement du pool, garantissant ainsi qu’au moins une
instance reste toujours disponible.
[Link] d'ensemble
Le système s’organise selon cinq couches fonctionnelles superposées, chacune
jouant un rôle précis dans le traitement et la circulation des requêtes. La première
couche est la couche d’accès, composée des clients tels que le navigateur web,
l’application mobile ou les outils de test, et représente le point d’entrée externe du
système. La deuxième couche est la couche proxy, assurée par NGINX (port
8080), qui agit comme un load balancer externe et distribue le trafic entre deux
instances de l’API Gateway selon une stratégie de type Round Robin, constituant
ainsi un premier niveau de répartition de charge. La troisième couche est la couche
Gateway, constituée de deux instances de l’API Gateway (port 3000), intégrant un
load balancer intelligent basé sur plusieurs algorithmes, un service registry, la
gestion CORS, le logging centralisé ainsi que le routage vers les microservices
métier. La quatrième couche correspond à la couche des services, composée des
23
Chapitre4 : Présentation de l’application finale
[Link] de communication
Le flux de traitement d'une requête suit le chemin suivant :
[Link] de déploiement
L'ensemble du système est conteneurisé avec Docker. Le fichier docker-
[Link] orchestre huit conteneurs au sein d'un réseau Docker privé nommé
microservices-network :
24
Chapitre4 : Présentation de l’application finale
POST /auth/register : validation des champs (nom, email et mot de passe requis),
hachage du mot de passe avec bcrypt (coût de sel 10), insertion en base de données
avec gestion de la contrainte d'unicité de l'email (code PostgreSQL 23505), puis retour
du profil créé sans le mot de passe.
POST /auth/login : récupération de l'utilisateur à partir de son email, comparaison du
mot de passe avec [Link](), génération d'un jeton JWT signé à l'aide de la clé
secrète JWT_SECRET, puis retour du jeton et des informations de l'utilisateur.
GET /health : retourne l'état du service, son temps de fonctionnement (uptime) ainsi
qu'un horodatage au format ISO-8601.
La table users comprend les colonnes id (VARCHAR, clé primaire), name, email
(UNIQUE), password (haché), role, created_at et updated_at.
25
Chapitre4 : Présentation de l’application finale
Forwarding intelligent
Gestion des pannes
Administration
26
Chapitre4 : Présentation de l’application finale
Round Robin
L'algorithme Round Robin distribue les requêtes de manière cyclique entre toutes les instances
disponibles. Un compteur currentIndex est conservé puis incrémenté après chaque requête. La
sélection de l'instance repose sur l'opération modulo appliquée au nombre d'instances saines.
27
Chapitre4 : Présentation de l’application finale
Least Connections
L'algorithme Least Connections sélectionne l'instance possédant le plus faible
nombre de connexions actives au moment de la requête. Son comportement est
dynamique : une instance qui traite des requêtes longues voit son compteur
augmenter et reçoit automatiquement moins de nouvelles requêtes.
Complexité : O(n). Cet algorithme est particulièrement efficace lorsque la durée de
traitement des requêtes est variable.
USERS_WEIGHT = 2
ORDERS_WEIGHT = 3
AUTH_WEIGHT = 1
PAYMENT_WEIGHT = 1
Cette configuration signifie que le Orders Service reçoit environ trois fois plus de
requêtes que le Auth Service.
Complexité : O(Σw) pour la construction de la liste pondérée, puis O(1) pour la
sélection de l'instance.
IP Hash
L'algorithme IP Hash garantit la persistance des sessions (sticky sessions) en
calculant un hachage de l'adresse IP du client. L'instance cible est ensuite
déterminée grâce à une opération modulo appliquée au nombre d'instances
disponibles.
Complexité : O(k), où k représente la longueur de l'adresse IP. Cette méthode
garantit qu'un même client est systématiquement dirigé vers la même instance tant
que le pool de serveurs reste inchangé.
28
Chapitre4 : Présentation de l’application finale
Les principaux algorithmes de répartition de charge se distinguent par leur complexité, leur
gestion des sessions et leurs cas d’usage optimaux. L’algorithme Round Robin présente une
complexité en O(1) et ne nécessite pas de gestion de session, ce qui le rend adapté aux
environnements où les instances sont homogènes et les requêtes courtes et uniformes.
L’algorithme Least Connections, de complexité O(n), ne gère pas les sessions mais est
particulièrement efficace pour les API dont les requêtes ont des durées variables, comme les
traitements de type machine learning. Le Weighted Round Robin, avec une complexité de
O(Σw), fonctionne également sans session et est conçu pour des environnements hétérogènes
où les serveurs disposent de capacités différentes, permettant ainsi une répartition pondérée des
charges. Enfin, l’algorithme IP Hash, de complexité O(k), assure une gestion de session en
maintenant la cohérence des requêtes d’un même utilisateur, ce qui le rend adapté aux
applications stateful telles que les systèmes de panier d’achat ou les services nécessitant la
persistance de session utilisateur.
29
Chapitre4 : Présentation de l’application finale
[Link] de Séquence
30
Chapitre4 : Présentation de l’application finale
31
Chapitre4 : Présentation de l’application finale
[Link] d'Activité
32
Chapitre4 : Présentation de l’application finale
Conclusion
Ce chapitre a présenté l'ensemble du travail de conception qui sous-tend notre
système de Load Balancer Intelligent pour une architecture microservices.
L'analyse des besoins a mis en évidence quatre problèmes fondamentaux —
surcharge, absence de détection de pannes, rigidité de la distribution et manque
d'observabilité — auxquels notre solution apporte des réponses concrètes.
33
Chapitre4 : Présentation de l’application finale
Chapitre4 : Présentation de
l’application finale
34
Chapitre4 : Présentation de l’application finale
Introduction
Ce chapitre présente l'application finale développée dans le cadre de ce projet de fin
d'études. Après avoir posé les bases théoriques au chapitre 2 et défini l'architecture
et les besoins au chapitre 3, nous illustrons ici le résultat concret : une plateforme
web de démonstration d'une architecture microservices avec load balancing
intelligent, supervision en temps réel et gestion complète des données métier.
35
Chapitre4 : Présentation de l’application finale
La gestion des erreurs est assurée côté client : en cas d'échec d'authentification
(HTTP 401), un message d'alerte est affiché. En cas d'indisponibilité de l'API
Gateway, l'erreur réseau est interceptée et présentée à l'utilisateur.
[Link] d'ensemble
Le tableau de bord est la section centrale de l'application. Affiché immédiatement
après la connexion, il agrège en temps réel les informations essentielles de
36
Chapitre4 : Présentation de l’application finale
[Link] de statistiques
Les quatre cartes de statistiques en haut du tableau de bord sont alimentées
dynamiquement par la fonction `loadDashboardStats()`. Cette fonction effectue
trois requêtes parallèles : GET /health/services pour compter les services sains,
GET /health pour obtenir l'uptime de la gateway, et GET /admin/lb/current pour
afficher l'algorithme de load balancing actif. Les valeurs sont mises à jour à chaque
chargement de la section Dashboard.
[Link]ésentation
La section API Endpoints, accessible depuis le tableau de bord, documente
l'ensemble des routes disponibles à travers l'API Gateway ([Link] via
Nginx). Elle est organisée par domaine fonctionnel : authentification, gestion des
37
Chapitre4 : Présentation de l’application finale
Authentification
Users
Orders
Payments
38
Chapitre4 : Présentation de l’application finale
ressource
39
Chapitre4 : Présentation de l’application finale
Figure 4.5 — Interface de gestion des commandes avec indication du serveur sélectionné par le
load balancer
40
Chapitre4 : Présentation de l’application finale
[Link]ésentation
La section Services Health est dédiée à la supervision en temps réel de l'état de
chaque microservice. Elle est automatiquement chargée à chaque navigation vers
cette section. L'information est obtenue via un appel à GET /health/services de
l'API Gateway, qui interroge en parallèle ([Link]) les endpoints /health
de chacun des quatre microservices.
41
Chapitre4 : Présentation de l’application finale
Figure 4.6 — Interface de supervision des services : tous les services sont en état healthy
42
Chapitre4 : Présentation de l’application finale
Figure 4.7 — Interface de gestion du load balancer avec sélection d'algorithme et statistiques
43
Chapitre4 : Présentation de l’application finale
Les statistiques affichées par le bouton 'Load Balancer Stats' proviennent de GET
/admin/lb/stats et détaillent pour chaque service : l'algorithme actif, le nombre total
de serveurs, le nombre de serveurs sains, et pour chaque serveur son URL, son
poids, le nombre de connexions actives et son état de santé.
Figure 4.8 — Interface de logs système : journal des opérations en temps réel
Ces logs client complètent les logs serveur stockés dans les fichiers
`logs/<service>.log` par le système de logging JSON côté [Link]. La combinaison
44
Chapitre4 : Présentation de l’application finale
des deux niveaux de logging offre une traçabilité complète : depuis l'action
utilisateur dans le navigateur jusqu'à l'exécution dans le microservice cible.
Conclusion
Ce chapitre a présenté l'ensemble des interfaces de la plateforme finale.
L'application démontre concrètement les principes architecturaux définis dans les
chapitres précédents à travers une interface fonctionnelle et cohérente.
45
Chapitre4 : Présentation de l’application finale
Chapitre 5 : Tests,Validation
46
Chapitre4 : Présentation de l’application finale
Introduction
Ce chapitre présente la stratégie de validation adoptée pour l'architecture
microservices développée dans le cadre de ce projet de fin d'études. L'application
repose sur cinq composants distribués — un API Gateway, et quatre services métier
(Auth, Users, Orders, Payment) — orchestrés via Docker et exposés au client à
travers un frontend [Link]. La fiabilité de ce système distribué nécessite une
batterie de tests couvrant chaque couche : les fonctionnalités métier, le routage de
l'API Gateway, les mécanismes de santé (Health Check) et enfin l'équilibrage de
charge (Load Balancing).
Les tests ont été conduits selon une approche progressive allant du test unitaire de
chaque service vers l'intégration complète de la chaîne de traitement. Les résultats
obtenus confirment la robustesse de l'architecture et valident les choix
technologiques effectués.
Tests unitaires de service : chaque microservice est testé de manière isolée en ciblant ses
endpoints REST, ses règles de validation des entrées et ses comportements d'erreur.
Tests d'intégration via l'API Gateway : les flux complets (login → création de
commande → paiement) sont joués à travers le gateway pour vérifier le routage et la
transmission des jetons de service.
Tests d'infrastructure : les endpoints de health check et le comportement du load
balancer sont validés indépendamment pour garantir la disponibilité et l'équité de
répartition du trafic.
Les tests sont automatisés via le script [Link] (ou [Link] sous Windows) fourni
avec le projet. Chaque appel curl cible le gateway sur le port 3000, lequel achemine
les requêtes vers le microservice approprié à l'aide du load balancer interne. Les
réponses JSON sont vérifiées visuellement et enregistrées dans logs/[Link].
47
Chapitre4 : Présentation de l’application finale
48
Chapitre4 : Présentation de l’application finale
Scénario 4 — Déconnexion
POST /api/auth/logout
Body : { "token": "<token>" }
→ 200 OK : { "success": true, "message": "Logged out successfully" }
49
Chapitre4 : Présentation de l’application finale
utilisate JSON sé
urs
50
Chapitre4 : Présentation de l’application finale
51
Chapitre4 : Présentation de l’application finale
52
Chapitre4 : Présentation de l’application finale
53
Chapitre4 : Présentation de l’application finale
Balance é
r
En retour, le gateway ajoute dans chaque réponse client les en-têtes x-selected-
server (URL du microservice ayant traité la requête) et x-load-balancer (algorithme
utilisé), permettant une traçabilité complète.
// Extrait de api-gateway/[Link]
if (server && ([Link] === "ECONNREFUSED" || [Link] === "ETIMEDOUT")) {
[Link]([Link], false);
}
[Link](503).json({ success: false, message: "Service unavailable" });
54
Chapitre4 : Présentation de l’application finale
Scénario Comport C St
ement od at
attendu e ut
H
T
T
P
Timeout 503 + 50 ✅
(>10s) message 3 Pa
timeout ssé
Service de Remise en 20 ✅
retour en ligne healthy 0 Pa
automatiq ssé
ue
GET [Link]
{
"service": "auth-service",
"status": "healthy",
"timestamp": "2025-06-15T10:22:34.512Z",
"uptime": 1523.47
}
55
Chapitre4 : Présentation de l’application finale
56
Chapitre4 : Présentation de l’application finale
Nginx fournie dans nginx/[Link] intègre déjà deux instances de gateway dans
l'upstream api_gateway_cluster.
[Link] implémentés
Algorithme Principe Cas d'usage
57
Chapitre4 : Présentation de l’application finale
Arrêt simulé d'un service → code d'erreur ECONNREFUSED détecté par le gateway.
setHealth(url, false) : serveur retiré du pool actif du load balancer.
Redémarrage du service → prochain health check le remet en healthy (manuel ou
automatique).
58
Chapitre4 : Présentation de l’application finale
Do C P Éc Ta
ma a a ho ux
ine s s ué de
t s s ré
e é us
s s sit
t e
é
s
Aut 6 6 0 10
h 0
Ser %
vice
Use 6 6 0 10
rs 0
Ser %
vice
Ord 7 7 0 10
ers 0
Ser %
vice
Pay 6 6 0 10
men 0
t %
59
Chapitre4 : Présentation de l’application finale
Do C P Éc Ta
ma a a ho ux
ine s s ué de
t s s ré
e é us
s s sit
t e
é
s
Ser
vice
API 8 8 0 10
Gat 0
ewa %
y—
Rou
tage
API 4 4 0 10
Gat 0
ewa %
y—
Erre
urs
Hea 5 5 0 10
lth 0
Che %
ck
indi
vidu
el
Hea 1 1 0 10
lth 0
Che %
ck
agré
gé
Loa 4 4 0 10
d 0
Bal %
anci
ng
Ad 4 4 0 10
min 0
Loa %
d
Bal
anc
er
60
Chapitre4 : Présentation de l’application finale
Do C P Éc Ta
ma a a ho ux
ine s s ué de
t s s ré
e é us
s s sit
t e
é
s
TO 5 5 0 10
TA 1 1 0
L %
Les 51 cas de test exécutés ont tous abouti au résultat attendu, avec un taux de
réussite global de 100 %. Ces résultats confirment que :
Chaque microservice répond correctement aux cas nominaux et aux cas d'erreur les plus
courants.
L'API Gateway assure un routage fiable et une gestion appropriée des défaillances de
service.
Le mécanisme de Health Check permet une supervision en temps réel de l'état du
système.
Le Load Balancer distribue le trafic équitablement et bascule automatiquement en cas
de panne.
L'algorithme d'équilibrage peut être modifié à chaud sans interruption de service.
61
Chapitre4 : Présentation de l’application finale
réponse de 74 ms, tandis que Least Connections atteint également de très bons
résultats grâce à une meilleure répartition dynamique des requêtes.
Répartition de
Algorithme Temps moyen Cas d'utilisation
charge
Round Robin Uniforme 91 ms Charge homogène
Least Connections Dynamique 79 ms Charge variable
Serveurs de capacités
Weighted Round Robin Pondérée 74 ms
différentes
IP Hash Basée sur le client 87 ms Persistance de session
Conclusion
62
Chapitre4 : Présentation de l’application finale
63
Chapitre4 : Présentation de l’application finale
Conclusion Générale
Dans un contexte où les applications modernes doivent répondre à des exigences
croissantes de performance, de disponibilité et de flexibilité, les architectures
monolithiques montrent progressivement leurs limites face à l’augmentation du
trafic et à la complexité des systèmes. Cette évolution a favorisé l’adoption des
architectures microservices, qui permettent de concevoir des applications
modulaires, évolutives et plus faciles à maintenir.
La problématique abordée dans ce projet concernait la nécessité d’améliorer la
répartition des requêtes au sein d’une architecture microservices afin d’éviter la
surcharge de certains services, de garantir leur disponibilité et d’optimiser les
performances globales du système. Pour répondre à cette problématique, nous
avons conçu et développé une solution reposant sur une architecture microservices
intégrant une API Gateway, un mécanisme de Load Balancing ainsi qu’un système
de supervision permettant le suivi de l’état des services.
La solution réalisée permet de distribuer efficacement les requêtes entre plusieurs
instances de services, d’assurer une gestion centralisée des accès grâce à l’API
Gateway et de surveiller en temps réel le fonctionnement des différents composants
du système. Les fonctionnalités développées incluent notamment la gestion des
microservices, le monitoring des services, la consultation des logs, le contrôle des
endpoints API ainsi que la vérification de l’état de santé des services.
Les résultats obtenus démontrent une amélioration significative de la disponibilité,
de la scalabilité et de la résilience de l’architecture. Le mécanisme de Load
Balancing mis en place contribue à une meilleure répartition de la charge et réduit
les risques de saturation d’un service particulier. De plus, l’architecture proposée
facilite les opérations de maintenance, les mises à jour et l’évolution future du
système.
Ce projet a permis d’approfondir plusieurs compétences techniques liées aux
architectures distribuées, aux microservices, aux API REST, aux mécanismes de
répartition de charge, à la supervision des systèmes et aux technologies modernes
de développement. Il constitue également une base solide pour la conception
d’applications robustes capables de répondre aux exigences des environnements
numériques actuels.
64
Chapitre4 : Présentation de l’application finale
Malgré les résultats obtenus, certaines limites subsistent. Les tests réalisés ont été
effectués dans un environnement contrôlé et pourraient être complétés par des
expérimentations à plus grande échelle. Par ailleurs, certains aspects avancés tels
que l’auto-scaling dynamique, la tolérance aux pannes automatisée ou
l’orchestration complète des services n’ont pas été intégrés dans cette première
version.
Comme perspectives futures, il serait intéressant d’intégrer des mécanismes
d’orchestration à l’aide de Kubernetes, de mettre en œuvre l’auto-scaling
automatique des services en fonction de la charge, d’ajouter des outils avancés
d’observabilité et de monitoring, ainsi que d’explorer l’utilisation d’algorithmes
intelligents de répartition de charge basés sur l’intelligence artificielle afin
d’améliorer davantage les performances et la disponibilité du système.
65
Chapitre4 : Présentation de l’application finale
Bibliographie
[1] JONES, M., BRADLEY, J., SAKIMURA, N. RFC 7519 — JSON Web Token
(JWT).
Disponible sur :
[Link]
67
Chapitre4 : Présentation de l’application finale
[7] Jones M., Bradley J., Sakimura N. RFC 7519: JSON Web Token (JWT). IETF,
2015.
68