PFE Report
PFE Report
MEMOIRE
En vue de l’obtention du diplôme d’ingénieur d’état
Filière: Informatique
Spécialité: Système D’information et Web (SIW)
Thème
Présenté par:
AOUADJ Moncef
1
Resumé
Face à la complexité croissante des applications logicielles modernes, les défis liés à leur
développement, déploiement et maintenance sont devenus plus pressants. L’architecture mi-
croservices, en décomposant les applications en services indépendants, se présente comme une
solution efficace pour améliorer la flexibilité, l’évolutivité et la maintenabilité des systèmes.
2
Abstract
In the face of the growing complexity of modern software applications, the challenges related
to their development, deployment, and maintenance have become increasingly pressing. The
microservices architecture, which breaks down applications into independent services, offers
an effective solution to enhance the flexibility, scalability, and maintainability of systems.
This thesis addresses the migration of the educational application ”ShellOnYou” from
a monolithic architecture to a microservices architecture. The migration process involved
redefining the application into several autonomous services, each responsible for a specific
part of the overall functionality. This restructuring not only facilitated the management and
deployment of the application but also improved its ability to evolve with future needs.
3
CONTENTS
I Introduction 11
1 Introduction 12
1.1 Contexte et Présentation Générale . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2 Motivation et Énoncé du Problème . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3 Objectifs du Mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4 Plan de la Thèse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
II Background 14
2 Architecture Monolithique 15
2.1 Introduction à l’Architecture Monolithique . . . . . . . . . . . . . . . . . . . . 15
2.2 Structure et Composants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3 Avantages et Utilisation Initiale . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.4 Défis et Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.4.1 Pile Technologique . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.4.2 Scalabilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.4.3 Gestion des Changements et Maintenance . . . . . . . . . . . . . . . 18
2.4.4 Déploiement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.4.5 Dette Architecturale et Silos de Données . . . . . . . . . . . . . . . . 18
3 Architecture SOA 19
3.1 Principes et Pratiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.1.1 Caractéristiques de SOA . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.1.2 Pratiques Courantes . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.2 Catégories de Services en SOA . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4
4 Architecture Microservices 21
4.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.2 Les Caractéristiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.3 Avantages et Inconvénients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5
III Contribution 37
7 Introduction 38
8 Présentation du Système 39
8.1 Introduction à ShellOnYou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
8.2 Fonctionnement général . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
8.2.1 Architecture Monolithique de l’Application ShellOnYou (SOY) . . . . 40
8.2.1.1 SOY Interface . . . . . . . . . . . . . . . . . . . . . . . . . . 40
8.2.1.2 SOY Controller . . . . . . . . . . . . . . . . . . . . . . . . . 40
8.2.1.3 SOY Model . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
8.2.1.4 SOY Database . . . . . . . . . . . . . . . . . . . . . . . . . 42
8.2.2 Intégration et interactions . . . . . . . . . . . . . . . . . . . . . . . . 42
8.2.3 Problèmes de performance . . . . . . . . . . . . . . . . . . . . . . . . 42
8.2.4 Conséquences et anticipation . . . . . . . . . . . . . . . . . . . . . . 43
8.3 Évolution et Améliorations des Versions Précédentes . . . . . . . . . . . . . . 43
8.3.1 Ajout de Fonctionnalités: . . . . . . . . . . . . . . . . . . . . . . . . 43
8.3.2 Mise à jour de l’Interface Utilisateur: . . . . . . . . . . . . . . . . . . 43
8.3.3 Stabilité du Stack Technologique: . . . . . . . . . . . . . . . . . . . . 44
8.3.4 Incrémentation Basée sur les Retours: . . . . . . . . . . . . . . . . . 44
8.3.5 Visualisation des Données: . . . . . . . . . . . . . . . . . . . . . . . . 44
8.4 De Monolithique (v6) à Microservices (v7) . . . . . . . . . . . . . . . . . . . . 44
8.4.1 Analyse Initiale et Décision de Migration . . . . . . . . . . . . . . . . 44
8.4.2 Domain-Driven Design (DDD) . . . . . . . . . . . . . . . . . . . . . . 46
8.4.2.1 Application du Domain-Driven Design (DDD) dans notre
Projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
8.4.2.2 Identification des Domaines Contextuels . . . . . . . . . . . 47
8.4.2.2.1 1. Contexte des Utilisateurs . . . . . . . . . . . . . 47
8.4.2.2.2 2. Contexte des Compétences . . . . . . . . . . . . 47
8.4.2.2.3 3. Contexte des Étudiants et de leurs Productions . 47
8.4.2.2.4 4. Contexte des Enseignants et des Exercices (ms-
exercise-teacher) . . . . . . . . . . . . . . . . . . . 48
8.4.2.3 Bénéfices du DDD dans la Migration vers les Microservices . 48
8.4.3 Analyse Statique du Code . . . . . . . . . . . . . . . . . . . . . . . . 49
8.4.4 Tableau de Transaction . . . . . . . . . . . . . . . . . . . . . . . . . 49
8.4.4.1 Ms-exercise-4-teacher . . . . . . . . . . . . . . . . . . . . . . 49
8.4.4.2 Ms-exercise-4-student . . . . . . . . . . . . . . . . . . . . . . 54
8.4.4.3 Ms-user . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
6
8.4.4.4 Ms-skill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
8.4.5 Définition des Microservices . . . . . . . . . . . . . . . . . . . . . . . 66
8.4.6 Visualisation de l’Architecture . . . . . . . . . . . . . . . . . . . . . . 67
9 Refonte Technique 70
9.1 Migration de JavaScript à TypeScript . . . . . . . . . . . . . . . . . . . . . . 70
9.1.1 Contexte JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
9.1.2 Introduction à TypeScript . . . . . . . . . . . . . . . . . . . . . . . . 70
9.1.3 Avantages de TypeScript . . . . . . . . . . . . . . . . . . . . . . . . . 71
9.1.4 Défis de la Migration . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
9.2 Introduction de la Couche Service . . . . . . . . . . . . . . . . . . . . . . . . . 71
9.2.1 Structure de Microservice . . . . . . . . . . . . . . . . . . . . . . . . 71
9.3 Impact de la Refonte sur la Performance et la Maintenabilité . . . . . . . . . . 72
10 Analyse du Résultat 73
10.1 Analyse du Résultat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
10.2 SonarQube: Un Outil d’Analyse de Code . . . . . . . . . . . . . . . . . . . . . 73
10.3 Résultats de l’Analyse SonarQube . . . . . . . . . . . . . . . . . . . . . . . . . 73
10.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
13 Gestion de Projet 80
13.1 Organisation des Tâches avec Trello et GitLab Issues . . . . . . . . . . . . . . 80
13.1.1 Trello . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
13.1.2 GitLab Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
13.2 Communication et Collaboration avec Mattermost . . . . . . . . . . . . . . . . 81
13.3 Réunions Virtuelles avec Zoom . . . . . . . . . . . . . . . . . . . . . . . . . . 82
7
13.4 Bilan de la Gestion de Projet . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
IV Conclusion et perspectives 86
15 Conclusion et perspectives 87
15.1 Récapitulatif des Principales Réalisations . . . . . . . . . . . . . . . . . . . . . 87
15.2 Perspectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Bibliography 90
8
LIST OF FIGURES
9
LIST OF TABLES
10
Part I
Introduction
11
Section 1
Introduction
12
1.2 Motivation et Énoncé du Problème
Les architectures monolithiques, bien qu’efficaces pour les petites applications ou les pro-
totypes, présentent des défis significatifs en termes de scalabilité et de maintenance, par-
ticulièrement sous des charges élevées. Pour ShellOnYou, les problèmes de performance
étaient principalement dus aux appels système bloquants effectués par des scripts Python
pour évaluer les réponses des étudiants. Ce ”goulot d’étranglement” a rendu impératif une
réévaluation de l’architecture sous-jacente. La motivation derrière cette migration était donc
double : améliorer la performance et la scalabilité de l’application tout en facilitant son
déploiement et sa maintenance.
• Évaluation des performances avant et après la migration pour quantifier les améliora-
tions apportées.
13
Part II
Background
14
Section 2
Architecture Monolithique
15
Figure 2.1: Modèle générique d’architecture monolithique
2.4.2 Scalabilité
La scalabilité d’une architecture monolithique est limitée. Toutes les fonctionnalités
partagent les ressources (CPU et mémoire) d’un même système hôte, ce qui peut conduire à
une saturation des ressources en cas de forte demande pour une fonctionnalité particulière.
16
La mise à l’échelle verticale, en augmentant la mémoire, est souvent insuffisante, et la mise
à l’échelle horizontale, en ajoutant des serveurs redondants, est coûteuse et complexe à gérer
[1, 5].
Par conséquent, la mise à l’échelle horizontale, illustrée à la figure 2.2, est la seule solution
réaliste pour augmenter la capacité des monolithes. Cela implique d’ajouter plus d’instances
de l’application entière sur de nouveaux serveurs redondants jusqu’à ce que la capacité soit
suffisante pour traiter les demandes provenant de l’interface utilisateur graphique. Il est
également nécessaire d’utiliser un équilibreur de charge pour distribuer les requêtes entrantes
entre les serveurs. La réplication des sessions est nécessaire pour distribuer les sessions entre
les serveurs afin qu’une session utilisateur puisse être traitée sur plusieurs serveurs. Comme
l’illustre la figure 3, il n’y a pas de base de données partagée entre les instances fonctionnant
sur des serveurs distincts. Il est donc nécessaire de répliquer la base de données pour garantir
des instances actuelles et redondantes de la base de données. Cette technique de mise à
l’échelle est coûteuse et ajoute de la complexité au système exécutant les instances, et n’est
pas bien adaptée au déploiement dans le cloud [1].
17
2.4.3 Gestion des Changements et Maintenance
Avec l’augmentation du nombre de fonctionnalités, un monolithe devient de plus en plus
complexe à maintenir. Les fonctionnalités sont fortement couplées et interdépendantes, ren-
dant chaque changement potentiellement risqué pour l’ensemble du système. Tester une
fonctionnalité modifiée nécessite souvent de re-tester l’application entière, augmentant le
temps et les coûts de maintenance [5, 6].
2.4.4 Déploiement
Le déploiement d’une application monolithique est un autre défi majeur. Il n’est pas
possible de déployer des fonctionnalités individuelles de manière indépendante ; c’est toujours
l’application entière qui doit être déployée. Cela implique souvent des temps d’arrêt pendant
le redémarrage de l’application, à moins d’utiliser des configurations de haute disponibilité
qui peuvent être coûteuses [5, 7].
18
Section 3
Architecture SOA
19
• Réutilisation des services: Les services dans une architecture SOA sont conçus pour
être réutilisés dans différents contextes et applications. Cela permet de réduire les coûts
et le temps de développement en réutilisant des fonctionnalités existantes plutôt que
de les reconstruire à chaque fois.
• Modularité: Chaque service est un module indépendant qui peut être développé,
déployé, maintenu et mis à jour indépendamment des autres services.
• Abstraction: Les détails de l’implémentation des services sont cachés derrière des
interfaces bien définies. Cela permet aux utilisateurs des services de se concentrer sur
l’utilisation de leurs fonctionnalités sans se préoccuper de leur fonctionnement interne.
• Services d’entreprise: Ce sont des services de haut niveau qui sont souvent réutil-
isables à travers plusieurs applications et processus métier. Ils sont alignés avec les
modèles d’information de l’entreprise et fournissent des fonctionnalités essentielles.
• Services internes: Ces services sont généralement conçus pour des besoins spécifiques
à une unité d’affaires et ne sont pas destinés à la réutilisation à l’échelle de l’entreprise.
• Services de produits: Fournis par des fournisseurs externes ou par des produits spéci-
fiques, ces services sont intégrés dans les solutions SOA pour fournir des fonctionnalités
spécialisées.
L’architecture SOA offre une grande flexibilité et peut contribuer à une plus grande
agilité dans les entreprises, mais elle peut aussi introduire des complexités, notamment dans
la gestion et l’orchestration des services. Son succès dépend de la capacité à bien concevoir
et implémenter ses composants, ainsi que de l’adoption de bonnes pratiques en matière de
gouvernance et de gestion des services.
20
Section 4
Architecture Microservices
4.1 Définition
L’architecture des microservices est une approche de conception d’applications comme un
ensemble de services petits, autonomes, et déployables indépendamment. Chaque microser-
vice exécute un processus d’affaires spécifique et communique via des interfaces légères, typ-
iquement des API HTTP. Cette architecture se distingue des architectures monolithiques et
SOA par sa capacité à fonctionner indépendamment en choisissant ses propres technologies
et plateformes, ce qui permet une évolutivité et une maintenance améliorées. Selon Newman
(2015), les microservices peuvent être envisagés comme des applications indépendantes qui
coopèrent pour former une application globale plus grande [14].
21
4.2 Les Caractéristiques
Les caractéristiques principales des microservices comprennent:
• Tolérance aux pannes : Ils sont conçus pour être résilients ; l’échec d’un microservice
n’impacte pas directement les autres. Des stratégies comme les circuits breakers sont
souvent utilisées pour gérer les échecs et maintenir la disponibilité du système [16].
Inconvénients :
22
• Consistance des données : Assurer la consistance des données à travers des ser-
vices distribués pose des défis particuliers, souvent gérés par des techniques comme les
transactions compensatoires ou les événements asynchrones [18].
23
Section 5
Les architectures logicielles jouent un rôle crucial dans la manière dont les applications
sont conçues, développées et maintenues. Les modèles monolithiques, SOA (Service-Oriented
Architecture) et microservices offrent des approches distinctes avec des avantages et des
inconvénients spécifiques. Cette section fournit une analyse critique de ces architectures, en
se concentrant sur plusieurs aspects clés qui influencent leur adoption et leur efficacité dans
différents environnements de développement. Les facteurs utilisés pour cette comparaison
comprennent :
• Maintenance: Considère la facilité avec laquelle chaque architecture peut être mise à
jour et maintenue, en tenant compte de la complexité des mises à jour et de l’impact
potentiel des changements sur l’ensemble du système.
• Gestion des données: Discute de la manière dont chaque architecture gère les don-
nées, notamment en termes de centralisation versus décentralisation et de gestion de la
cohérence des données.
24
• Sécurité: Analyse les défis et les approches de la sécurité dans chaque architecture,
y compris la gestion des risques de sécurité liés à la distribution et à l’intégration des
services.
Ces critères sont essentiels pour comprendre les implications pratiques de choisir une ar-
chitecture sur une autre en fonction des besoins spécifiques d’un projet ou d’une organisation.
Le tableau suivant résume et compare ces architectures selon ces dimensions clés.
25
Critère Monolithique SOA Microservices
Conception Unité indivisible Ensemble de Collection de ser-
avec toutes les services inter- vices indépendants
fonctionnalités dépendants et autonomes
intégrées
Scalabilité Scalabilité verticale Scalabilité horizon- Excellente scala-
principalement, né- tale possible mais bilité horizontale,
cessite la duplica- gestion complexe chaque service est
tion complète de due aux dépen- indépendant
l’application dances
Maintenance Peut être com- Amélioration grâce Plus facile et
plexe, car une à la modularité des rapide, chaque ser-
modification né- services mais coor- vice est mis à jour
cessite souvent le dination nécessaire indépendamment
redéploiement de
tout le système
Déploiement Risqué et poten- Moins risqué que le Simplifié et con-
tiellement instable, monolithique, peut tinu, avec des
affecte toute l’ap- nécessiter une ges- déploiements
plication tion complexe des indépendants min-
versions imisant les risques
d’interruption
Gestion des données Centralisée, ce Peut être décentral- Complètement dé-
qui peut créer des isée mais souvent centralisée, chaque
goulots d’étrangle- synchronisée via service gère ses pro-
ment des services d’en- pres données, ce qui
treprise améliore la perfor-
mance
Sécurité Un seul point de Nécessite une sécu- Défis en termes de
sécurité, plus facile rité coordonnée à sécurité distribuée,
à gérer mais risque travers les services, chaque service doit
plus élevé en cas de complexe à gérer implémenter ses
compromission propres mesures
Intégration technologique Limitée à une stack Permet une cer- Très flexible, per-
technologique, dif- taine hétérogénéité met l’utilisation
ficile d’intégrer de mais peut être de différentes tech-
nouvelles technolo- limitée par des nologies et stacks
gies sans une re- contraintes d’in- pour chaque service
fonte complète teropérabilité
26
Section 6
L’architecture des microservices n’est pas simplement un style architectural, mais une
suite de patterns stratégiques et opérationnels qui aident à décomposer une application en
services plus petits et gérables. Ces patterns ont pour double objectif de déterminer la per-
tinence des microservices pour une application spécifique et de faciliter une implémentation
efficace de cette architecture, comme le soutiennent [19, 20].
27
• Soutien: Fonctions qui supportent le noyau mais peuvent être externalisées ou inter-
nalisées selon les besoins.
Cette segmentation permet à chaque service de se concentrer sur des responsabilités claires
et bien définies, améliorant ainsi la cohérence et la qualité du service.
• Pattern de Service par Équipe: Services développés par des équipes dédiées, re-
sponsables de l’intégralité du cycle de vie du service. Cette approche renforce la pro-
priété et la responsabilité, accélérant le développement et améliorant la qualité [20].
28
Write-Ahead Logging (WAL). Ces journaux sont ensuite traités et envoyés à une file d’at-
tente pour être gérés de manière asynchrone, facilitant ainsi la réplication des données ou la
synchronisation entre différents services.
• Avantages :
29
schémas de données existants, il introduit un niveau de couplage qui peut compromettre
l’indépendance des services.
• Avantages :
– Migration facilitée : Les entreprises peuvent migrer vers des microservices sans
redéfinir entièrement leur modèle de données.
– Réutilisation des schémas : Économise le temps et les ressources en évitant de
redévelopper les schémas de base de données.
• Utilisation :
30
Avantages :
• Utilisation optimisée des ressources : Les ressources de l’hôte sont pleinement utilisées,
ce qui peut réduire les coûts d’infrastructure.
Inconvénients :
• Couplage potentiel : La défaillance d’un hôte peut affecter plusieurs services, augmen-
tant le risque de points de défaillance uniques.
• Conflits de ressources : Les services partageant un même hôte peuvent entrer en com-
pétition pour les ressources, ce qui peut entraîner des problèmes de performance.
• Réduction des conflits de ressources : Aucun service ne partage ses ressources, ce qui
élimine les conflits potentiels et garantit une performance plus prévisible.
Inconvénients :
• Utilisation inefficace des ressources : Peut entraîner une sous-utilisation des ressources,
surtout si les services ne nécessitent pas les capacités complètes de l’hôte.
• Coûts plus élevés : Nécessite potentiellement plus d’hôtes, ce qui peut augmenter les
coûts d’infrastructure.
31
6.5 Les Patterns d’API Externes
6.5.1 API-Gateway
L’API-Gateway est un élément central dans les architectures modernes de microservices,
agissant comme intermédiaire entre les clients externes et les services internes. Inspiré des
principes de l’architecture orientée services (SOA), il remplace les architectures traditionnelles
basées sur un bus de services d’entreprise (ESB). L’API-Gateway simplifie les interactions
client-service, en gérant l’acheminement des requêtes, la transformation des protocoles, et la
mise en œuvre de logiques communes telles que l’authentification.
Fonctionnalités clés de l’API-Gateway :
• Routage des demandes: Oriente les requêtes clients vers les microservices appro-
priés.
• Agrégation des réponses: Combine les réponses de divers microservices pour fournir
une réponse unifiée.
• Sécurité: Centralise la gestion des identités et des accès pour sécuriser les services.
Avantages :
Inconvénients :
32
Inconvénients :
• Duplication des fonctionnalités et complexité opérationnelle accrue.
Remarque : Vous pourriez envisager d’inclure une illustration ici pour montrer comment
ces patterns fonctionnent au sein d’une architecture de microservices.
• Gestion centralisée de la santé des services, éliminant les instances défaillantes du pool.
Inconvénients:
• Risque de point unique de défaillance avec le registre.
33
6.6.3 Pattern Registre de Services
Ce pattern implique un registre actif où chaque service s’enregistre à son démarrage et se
retire à son arrêt, permettant une interrogation efficace par les clients ou un intermédiaire.
Avantages:
Inconvénients:
Applications typiques: Des systèmes tels qu’Eureka Server et Apache ZooKeeper sont
souvent utilisés pour implémenter ces patterns, offrant des fonctionnalités avancées pour la
gestion des dynamiques de service dans des environnements distribués.
• Sécurité renforcée: Les jetons peuvent être chiffrés pour assurer la confidentialité des
données.
• Sans état: Idéal pour les architectures distribuées car ils ne nécessitent pas de stockage
de session côté serveur.
Inconvénients:
• Gestion des jetons: Nécessite un système robuste pour émettre, renouveler et révoquer
les jetons efficacement.
• Complexité: La mise en œuvre de la logique de validation des jetons peut être complexe.
34
6.7.2 Pattern de Porte de Sécurité (Security Gateway)
Similaire à l’API Gateway, le Security Gateway gère toutes les requêtes entrantes pour
l’authentification et l’autorisation avant qu’elles atteignent les microservices.
Avantages:
• Réduction des vulnérabilités: Minimise le risque d’attaques directes sur les microser-
vices.
Inconvénients:
• Latence accrue: Peut introduire un délai supplémentaire dans le traitement des deman-
des.
• Protection des données: Assure que les données compromisées restent indéchiffrables
sans la clé appropriée.
Inconvénients:
• Gestion des clés: Nécessite une gestion sécurisée des clés de chiffrement, ajoutant à la
complexité et au coût.
35
6.7.4 Pattern d’Audit et de Suivi
Ce pattern garantit que toutes les actions critiques ou accès aux données sensibles sont
enregistrés.
Avantages:
• Traçabilité: Permet de retracer les actions en cas de problème de sécurité ou pour des
audits réglementaires.
• Détecter les anomalies: Les logs peuvent être analysés pour détecter des comportements
inhabituels ou malveillants.
Inconvénients:
36
Part III
Contribution
37
Section 7
Introduction
Dans ce chapitre, nous détaillons les aspects techniques et stratégiques impliqués dans
le développement et la migration de l’application ”ShellOnYou” de sa version monolithique
initiale (v6) à une architecture basée sur les microservices (v7). Nous commencerons par
une exploration approfondie de l’environnement de développement, couvrant à la fois le
matériel et les logiciels utilisés, ainsi que les frameworks et les technologies qui ont facilité
cette transformation. Cette discussion inclura également les motivations derrière le choix
de chaque technologie et la manière dont elles se sont intégrées pour former une solution
cohérente. Ensuite, nous présenterons une analyse détaillée du processus de migration, en
expliquant les étapes de la décomposition de l’application monolithique en services distincts
et interopérables, suivant les principes du Domain-Driven Design (DDD) et soutenus par
une analyse statique rigoureuse du code existant. Ce processus a non seulement permis une
isolation efficace des responsabilités entre les différents composants de l’application mais a
également amélioré sa maintenabilité et sa scalabilité.
38
Section 8
Présentation du Système
39
8.2 Fonctionnement général
Dans sa configuration initiale, l’application “ShellOnYou” était conçue comme une ar-
chitecture monolithique, centralisant toutes les opérations et fonctionnalités en un seul et
même bloc de code. Ce modèle d’architecture facilitait les interactions entre les différents
composants de l’application, notamment la création d’exercices par les enseignants, la soumis-
sion de réponses par les étudiants, et l’évaluation automatique des réponses via des scripts
Python.
La couche des contrôleurs (SOY Controller) est responsable de la gestion des requêtes
métiers. Elle se situe entre l’interface utilisateur et le modèle de données. Les contrôleurs
interprètent les requêtes des utilisateurs, envoient les informations pertinentes au modèle
pour traitement et retournent les résultats à l’interface.
Quelques exemples de contrôleurs dans l’application SOY incluent :
• ExerciseController : Gère toutes les opérations liées aux exercices, telles que la
création, la mise à jour, la suppression et la récupération des exercices.
40
Figure 8.1: Schéma général de l’architecture monolithique de l’application ShellOnYou
Les contrôleurs jouent un rôle clé dans l’orchestration de la logique métier en assurant que
les bonnes données sont transmises et récupérées de la couche d’accès aux données (modèle).
La couche modèle (SOY Model) ou couche d’accès aux données est chargée de l’interac-
tion avec la base de données PostgreSQL. Le modèle définit la structure des données et les
relations entre elles, et offre des méthodes pour lire, écrire, mettre à jour et supprimer des
enregistrements dans la base de données.
Parmi les exemples de modèles dans l’application SOY, nous avons :
• UserModel : Définit la structure des données utilisateur, telles que l’ID, le nom,
l’email, et les rôles d’accès.
• ExerciseModel : Représente les données liées aux exercices, incluant l’ID de l’exercice,
les compétences associées, et les niveaux de difficulté.
41
La couche modèle isole la logique de manipulation des données de la logique métier,
rendant le code plus modulaire et maintenable.
La base de données PostgreSQL (SOY Database) est le référentiel central où toutes les
données de l’application sont stockées. Cette base de données est structurée selon des scripts
SQL exécutés dans un ordre bien précis pour créer et remplir les tables nécessaires à l’appli-
cation.
L’ordre d’exécution des scripts SQL est crucial pour garantir l’intégrité des données et
des relations. Voici quelques exemples des scripts utilisés dans l’application SOY :
Ces scripts sont exécutés séquentiellement pour bâtir la base de données et l’adapter aux
nouvelles exigences fonctionnelles à chaque évolution de l’application.
42
et Python, bien que fonctionnels, commençaient à devenir un goulot d’étranglement, impac-
tant le temps de réponse de l’application et l’expérience utilisateur.
43
exercices, et l’introduction de composants interactifs pour une interaction plus engageante.
Cette phase de développement monolithique a jeté les bases nécessaires pour comprendre
les limitations du système et les domaines nécessitant une refonte architecturale, conduisant
à la décision stratégique de migrer vers une architecture de microservices.
44
Figure 8.2: schéma de la base de données de la v6
45
Figure 8.3: schéma simplifié DB v6
L’application du DDD dans le cadre de la migration de ShellOnYou a joué un rôle clé dans
la segmentation des fonctionnalités de l’application monolithique en microservices autonomes.
En identifiant les ”domaines contextuels” (bounded contexts), nous avons pu délimiter les
différentes responsabilités métiers de manière claire et concise. Cette démarche a permis de
réduire la complexité de l’application en créant des services distincts, avec des responsabilités
bien définies, tout en minimisant les dépendances entre les composants.
Dans le cas de ShellOnYou, quatre domaines contextuels principaux ont été identifiés, ce
qui a guidé la création des quatre microservices suivants :
46
• user : Gère les informations des utilisateurs, leur authentification, leurs rôles, et leurs
sessions.
• skill : Traite la gestion des compétences et des niveaux associés aux exercices.
• student : S’occupe de la gestion des interactions des étudiants avec les exercices, y
compris les soumissions et les évaluations.
• teacher : Facilite la création et la gestion des exercices et des sessions par les en-
seignants.
47
8.4.2.2.4 4. Contexte des Enseignants et des Exercices (ms-exercise-teacher)
Le dernier domaine contextuel se concentre sur les enseignants et la création d’exercices et
de sessions. Ce contexte regroupe les fonctionnalités permettant aux enseignants de créer
des exercices, de gérer les sessions éducatives, et de suivre la progression des étudiants. Le
microservice ms-exercise-teacher implémente ces fonctionnalités, facilitant la gestion des
cours par les enseignants, leur permettant de modifier, publier et surveiller les exercices
et sessions. Il fournit également aux enseignants des outils pour suivre la progression des
étudiants et ajuster le contenu pédagogique en fonction des résultats.
Grâce à l’approche DDD, chaque microservice peut évoluer indépendamment des autres,
ce qui facilite le développement, les tests, et le déploiement continu. La migration vers cette
architecture microservices a permis de résoudre les limitations inhérentes à l’architecture
monolithique, en améliorant considérablement la capacité de ShellOnYou à évoluer avec le
nombre croissant d’utilisateurs et de fonctionnalités.
Cette méthodologie nous a permis de mieux comprendre les domaines métiers de l’appli-
cation et d’effectuer une transition efficace vers des microservices bien délimités et indépen-
dants.
48
8.4.3 Analyse Statique du Code
Parallèlement, une analyse statique du code a été utilisée pour évaluer la qualité du code
existant et identifier les patterns de code réutilisables ou nécessitant une refonte. Cela a
aidé à détecter les anomalies et à assurer que les nouvelles implémentations respectent les
standards de qualité et les bonnes pratiques de développement.
8.4.4.1 Ms-exercise-4-teacher
49
Transaction Affected Enti- Description Actions
Name ties
Create exercise exercise, exer- Crée un nouvel exer-
ciselevel cice dans la table ex- • Insérer un nouvel en-
ercise et ajoute un en- registrement dans la
registrement dans ex- table exercise
erciselevel avec ex_id,
• Récupérer l’ID du
skill_code, nam_id
nouvel exercice inséré
• Insérer un nouvel
enregistrement dans
exerciselevel avec
ex_id, skill_code,
nam_id (DEFAULT
VALUE 1: beginner)
50
Transaction Affected Enti- Description Actions
Name ties
Update exercise exercise, exer- Met à jour un exer-
ciselevel cice et met à jour les • Mettre à jour l’exer-
compétences dans ex- cice dans la table ex-
erciselevel ercise
• Insérer de nouveaux
enregistrements avec
de nouvelles com-
pétences (ex_id,
skill_code) dans
exerciselevel
• Supprimer l’exercice
de la table exercise où
ex_id
51
Transaction Affected Enti- Description Actions
Name ties
Get exercise exercise, soyuser Récupère un exercice
par id + infos de l’au- • Récupérer l’exer-
teur cice depuis la table
exercise par id
• Vérifier l’inscription
de userId à ses-
sionId depuis la table
usersession
52
Transaction Affected Enti- Description Actions
Name ties
Get session stats session, exercise, Récupère les stats de
sequence_ex- la session (score des • Récupérer la session
ercises, exer- productions, etc.) et par sessionId depuis
ciseproduction, vérifie l’auteur (seul session
soyuser l’enseignant qui a créé
• Récupérer la liste de
la session peut consul-
tous les exercices de la
ter les stats)
session en utilisant se-
quence, sequence_ex-
ercises, exercises
• Retourner la session
mise à jour
53
Transaction Affected Enti- Description Actions
Name ties
Get session stu- session, userses- Récupère les sessions
dent sion auxquelles un étudi- • Récupérer les sessions
ant est inscrit auxquelles un étudi-
ant est inscrit
8.4.4.2 Ms-exercise-4-student
54
Transaction Affected Enti- Description Actions
Name ties
Get student studentstate- Récupère un état étu-
statement ment (GET) diant par sessionId, • Récupérer l’énoncé
userId, exerciseId de l’étudiant par
sessionId, userId,
exerciseId
• Supprimer l’état de
studentstatement où
sessionId, userId,
exerciseId
• Évaluer et enregistrer
la production
55
Transaction Affected Enti- Description Actions
Name ties
Get exercise pro- exerciseproduc- Récupère la produc-
duction tion (GET) tion d’exercice par Id • Récupérer la produc-
depuis exerciseproduc- tion d’exercice par Id
tion
Delete exercise exerciseproduc- Supprime la produc-
production tion (Delete) tion d’exercice par Id • Supprimer la produc-
tion d’exercice par Id
56
Transaction Affected Enti- Description Actions
Name ties
Evaluate exer- exerciseproduc- Évalue une production
cise production tion (GET) d’exercice soumise par • Évaluer une pro-
un étudiant pour duction d’exercice
(LMS). Cela inclut le soumise par un
traitement des fichiers étudiant
liés à la soumission :
production d’exercice
elle-même, modèle
d’archive et énoncé
Generate state- studentstate- Génère un énoncé
ment (In exer- ment (generate pour un exercice. • Générer un énoncé
cise production) function) Cela utilise ModelStu- pour un exercice avec
dentStatement pour ModelStudentState-
générer l’énoncé et les ment
fichiers associés
8.4.4.3 Ms-user
57
Transaction Affected Enti- Description Actions
Name ties
Create user soyuser Crée un nouvel util-
isateur puis envoie un • Vérifier l’email : s’il
e-mail d’activation à existe déjà
l’utilisateur
• Vérifier la correspon-
dance du mot de passe
• Hacher le mot de
passe
• Créer l’utilisateur
• Envoyer un e-mail
d’activation
• JOIN !!
58
Transaction Affected Enti- Description Actions
Name ties
Get user skills skill, exercise- Récupère les com-
level, exer- pétences acquises • JOIN : exercisepro-
ciseproduction par l’utilisateur en duction, exerciselevel,
(JOIN), exercise fonction de leurs skill
productions d’exer-
• Traduire les compé-
cice avec un score
tences en fonction de
supérieur ou égal à
la locale (fr, en)
50, puis récupère les
détails de l’exercice • Récupérer l’exer-
correspondant cice correspondant
pour chaque compé-
tence depuis la table
exercise
• Activer l’utilisa-
teur en définissant
nonce=NULL et
enabled=TRUE
• Vérifier si l’utilisateur
existe
• Mettre à jour
59
Transaction Affected Enti- Description Actions
Name ties
Login soyuser Authentifie l’utilisa-
teur et génère des • Vérifier l’email et le
jetons mot de passe
• Supprimer le jeton
d’actualisation de to-
kenList (stockage en
mémoire)
• Générer un nouveau
jeton d’accès et le
stocker dans token-
List
60
Transaction Affected Enti- Description Actions
Name ties
Request pass- soyuser Gère le processus de
word reset demande de réinitiali- • Vérifier si l’email ex-
sation de mot de passe iste
• Générer un nouveau
nonce pour l’utilisa-
teur
• Envoyer un e-mail
à l’utilisateur pour
réinitialiser son mot
de passe
• Hacher le mot de
passe
61
Transaction Affected Enti- Description Actions
Name ties
Update user soyuser, userrole Met à jour les infor-
mations de l’utilisa- • Vérifier les nouvelles
teur (réservé à l’ad- données
ministrateur)
• Vérifier si l’utilisateur
existe
• Retourner le nouvel
utilisateur avec son
rôle associé
8.4.4.4 Ms-skill
62
compétences des étudiants et l’organisation des parcours d’apprentissage.
• Attacher chaque
thème à la compé-
tence correspondante
63
Transaction Affected Enti- Description Actions
Name ties
Update skill skill Mettre à jour et enreg-
istrer la compétence • Récupérer la compé-
mise à jour tence par skillCode
• Vérifier si la compé-
tence existe
64
Transaction Affected Enti- Description Actions
Name ties
Create all by ex- exerciselevel Lie plusieurs compé-
ercise (INSERT, GET) tences à un exercice. • Parcourir la liste des
compétences fournies
dans le corps de la re-
quête
65
Transaction Affected Enti- Description Actions
Name ties
Update profile profile Mettre à jour un profil
par profileID • Vérifier les nouvelles
données
• Sauvegarder et re-
tourner le profil mis à
jour
66
à structurer les parcours d’apprentissage personnalisés.
67
Figure 8.5: Vue simplifiée de la décomposition en microservices de l’application ShellOnYou
68
Figure 8.6: Vue détaillée de la décomposition en microservices de l’application ShellOnYou,
montrant les interactions détaillées entre les entités
69
Section 9
Refonte Technique
JavaScript est un langage de script polyvalent utilisé pour le développement web dy-
namique. Malgré sa popularité, il présente des limites en termes de sécurité de type, ce qui
peut conduire à des erreurs à l’exécution.
TypeScript, développé par Microsoft, étend JavaScript en ajoutant des types statiques.
Ce langage transcompilé améliore la maintenance et la performance du développement en
facilitant la détection précoce des erreurs et en offrant une meilleure autocomplétion lors de
la rédaction du code.
70
9.1.3 Avantages de TypeScript
Le passage à TypeScript procure de multiples avantages tels que :
• Meilleure intégration avec les IDEs modernes, offrant une expérience de développement
enrichie avec l’autocomplétion et le refactoring.
• Nécessité de refondre ou adapter les bibliothèques JavaScript existantes pour être com-
patibles avec les types TypeScript.
• Routes : Définit les endpoints de l’API et dirige les requêtes vers les contrôleurs
appropriés.
71
• Models : Représentent la structure des données et fournissent des méthodes pour
accéder à ces données, généralement via des opérations de base de données.
Figure 9.1: Structure du microservice Ms-skill illustrant l’organisation des composants in-
ternes.
72
Section 10
Analyse du Résultat
10.4 Conclusion
Les résultats obtenus ont montré que tous les microservices, ainsi que l’agrégat des mi-
croservices, respectaient les critères de qualité fixés au départ. Les analyses de SonarQube
73
ont confirmé que notre architecture de microservices était non seulement fonctionnelle mais
également optimisée pour la performance et la sécurité.
Figure 10.3: SonarQube : Student et Figure 10.4: SonarQube : Skill, User, Ag-
Teacher gregate
74
Section 11
11.1 Introduction
Dans cette section, nous détaillons les étapes suivies pour déployer les microservices de
l’application ”ShellOnYou” en utilisant Kubernetes, Minikube, et Docker. Le but principal
de cette orchestration est de gérer et de scaler efficacement les services au sein d’un cluster
Kubernetes.
75
11.4 Gestion des Services Kubernetes
Pour permettre aux microservices de communiquer entre eux et avec l’extérieur, nous
avons défini des services Kubernetes à travers des fichiers service.yaml. Ces fichiers définis-
saient les types de services, notamment :
• NodePort pour exposer certains services à l’extérieur du cluster, facilitant ainsi l’accès
depuis un navigateur ou une autre interface utilisateur.
Kubernetes a pris en charge le redéploiement des conteneurs sans causer d’interruption ma-
jeure du service.
76
Figure 11.1: Exemple de fichier deployment.yaml (ms-user-deployment.yaml)
77
Section 12
Dans le cadre du projet Shell On You, une des contributions majeures a été la création
de guides d’installation clairs et détaillés pour la mise en place de l’application, aussi bien
avant qu’après la migration vers une architecture microservices. Ces documents facilitent
non seulement l’installation, mais aussi la configuration et l’utilisation de l’environnement de
développement. Ils constituent une ressource précieuse pour les développeurs et utilisateurs
souhaitant déployer l’application localement ou sur des serveurs.
78
• Résolution des Problèmes Courants : Solutions pour des erreurs fréquentes liées
aux versions de Node.js et à la configuration des conteneurs.
Ce second guide a été essentiel pour faciliter la transition vers la nouvelle architecture
microservices et pour permettre aux équipes de développement de s’adapter rapidement aux
nouvelles méthodes de déploiement.
79
Section 13
Gestion de Projet
13.1.1 Trello
Trello a été utilisé pour gérer la vue d’ensemble des tâches. Chaque étape du projet, de
la conception à l’implémentation des microservices, était organisée en colonnes représentant
les différents statuts des tâches : TO DO, DOING, BLOCKED, et DONE. Chaque carte
Trello représentait une tâche spécifique, avec des échéances, des checklists détaillées et des
assignations de membres d’équipe.
80
Figure 13.1: Vue de l’espace de travail Trello
81
13.3 Réunions Virtuelles avec Zoom
Dans les cas où les réunions en présentiel étaient impossibles, l’équipe a utilisé Zoom
pour organiser des réunions virtuelles. Zoom a permis de rassembler toute l’équipe, quel
que soit l’emplacement, pour des réunions hebdomadaires de suivi, ainsi que des sessions de
résolution de problèmes techniques plus approfondies.
82
Section 14
14.2.1 Node.js
Node.js est un environnement d’exécution JavaScript côté serveur basé sur le moteur
JavaScript V8 de Chrome. Il est conçu pour construire des applications réseau évolutives et
efficaces. Node.js utilise un modèle d’entrées/sorties non bloquant et orienté événement, ce
qui le rend léger et efficace, parfait pour les applications gérant de nombreuses données en
temps réel sur des dispositifs distribués 1 .
14.2.2 React
React est une bibliothèque JavaScript pour construire des interfaces utilisateur. Dévelop-
pée par Facebook, React permet de créer des vues rendues de manière réactive pour chaque
état dans une application, permettant ainsi une mise à jour et un rendu efficaces des com-
posants appropriés lorsque les données changent. Sa force réside dans la capacité de gérer
1
https://en.wikipedia.org/wiki/Node.js
83
efficacement le DOM virtuel pour optimiser les interactions et les mises à jour de l’interface
utilisateur 2 .
14.2.3 PostgreSQL
PostgreSQL est un système de gestion de base de données relationnelle objet robuste et
complet. Il est reconnu pour sa conformité aux standards et son support étendu de fonc-
tionnalités SQL avancées, telles que les transactions sécurisées, les sous-requêtes complexes,
et les clés étrangères. Sa fiabilité, sa flexibilité et son support actif par une communauté
ouverte en font une base de données de choix pour les applications professionnelles 3 .
14.2.5 Docker
Docker est une plateforme de conteneurisation qui permet de développer, déployer et
exécuter des applications dans des conteneurs légers et portables. Les conteneurs Docker
encapsulent une application avec toutes ses dépendances dans un conteneur isolé, ce qui
garantit que l’application fonctionnera uniformément dans n’importe quel environnement de
machine. Cette technologie est cruciale pour assurer la cohérence des environnements de
développement, de test et de production 5 .
14.2.6 GitLab
GitLab est une plateforme de gestion de versions et de CI/CD (Continuous Integra-
tion/Continuous Delivery) qui supporte le développement de logiciels avec le contrôle de
version, la gestion des tâches, et les revues de code, ainsi que le déploiement continu. Elle
est utilisée pour collaborer sur des projets de code et automatiser la chaîne de déploiement
des applications, facilitant ainsi les processus de développement de logiciels complexes 6 .
2
https://en.wikipedia.org/wiki/React_(JavaScript_library)
3
https://en.wikipedia.org/wiki/PostgreSQL
4
https://en.wikipedia.org/wiki/Visual_Studio_Code
5
https://en.wikipedia.org/wiki/Docker_(software)
6
https://en.wikipedia.org/wiki/GitLab
84
Ces outils et technologies forment la base sur laquelle l’application ”ShellOnYou” a été
développée et migrée de son ancienne architecture monolithique à une solution basée sur les
microservices, en utilisant des méthodes modernes et efficaces pour répondre aux exigences
actuelles des applications web.
85
Part IV
Conclusion et perspectives
86
Section 15
Conclusion et perspectives
Chaque étape de ce projet a été conçue pour aligner l’application avec les meilleures pra-
tiques de l’industrie et pour répondre de manière proactive aux défis technologiques émer-
gents.
87
15.2 Perspectives
Alors que notre projet ShellOnYou a atteint des jalons significatifs dans l’amélioration de
la scalabilité et de la maintenabilité grâce à la migration vers les microservices, des possibilités
d’amélioration continue se présentent pour assurer que l’application reste à la pointe de
la technologie. Voici quelques-unes des principales orientations que nous envisageons pour
l’avenir :
88
Bibliography
89
[10] Thomas Erl. Service-Oriented Architecture: Concepts, Technology, and Design. Prentice
Hall, 2005.
[11] Nicolai M Josuttis. SOA in Practice: The Art of Distributed System Design. O’Reilly
Media, 2007.
[12] Dirk Krafzig, Karl Banke, and Dirk Slama. Enterprise SOA: Service-Oriented Archi-
tecture Best Practices. Prentice Hall, 2004.
[13] Michael P Papazoglou and Willem-Jan van den Heuvel. “Service-oriented architectures:
approaches, technologies and research issues.” In: The VLDB Journal—The Interna-
tional Journal on Very Large Data Bases 16.3 (2007), pp. 389–415.
[14] Sam Newman. Monolith to Microservices Evolutionary Patterns to Transform Your
Monolith. O’Reilly Media, 2022.
[15] Martin Fowler and James Lewis. “Microservices: a definition of this new architec-
tural term.” In: ThoughtWorks (2014). url: https://martinfowler.com/articles/
microservices.html.
[16] James Lewis and Martin Fowler. “Microservices.” In: ThoughtWorks (2014). url: https:
//martinfowler.com/microservices/.
[17] Nicola Dragoni et al. Microservices: Yesterday, Today, and Tomorrow. Springer, 2017.
[18] Martin Kleppmann. Designing Data-Intensive Applications: The Big Ideas Behind Re-
liable, Scalable, and Maintainable Systems. O’Reilly Media, Inc., 2017.
[19] Davide Taibi, Valentina Lenarduzzi, and Claus Pahl. “Architectural Patterns for Mi-
croservices: A Systematic Mapping Study.” In: Proceedings of the 6th International
Conference on Model-Driven Engineering and Software Development (Mar. 2018). doi:
10.5220/0006798302210232.
[20] Chris Richardson. Microservices Patterns: With examples in Java. Manning Publi-
cations, 2018. isbn: 9781617294549. url: https : / / books . google . dz / books ? id =
UeK1swEACAAJ.
[21] SonarSource. SonarQube Official Website. Accessed: 2024-08-28. 2024. url: https :
//www.sonarqube.org.
90