Architecture Micro-services ERP SaaS
Architecture Micro-services ERP SaaS
Effectué à
Préparé par
Elleuch Wajih
ii
Table des matières
Remerciement .................................................................................................................. ii
Introduction générale ....................................................................................................... 7
Présentation du cadre de projet ........................................................................................ 9
Introduction ................................................................................................................... 10
1 Presentation de l’organisme d’accueil...................................................................... 10
1.1 Les services de ASM ................................................................................................... 11
2 Présentation de projet............................................................................................. 11
3 Etudes de l’existant ................................................................................................. 11
3.1 Critique de l’existant .................................................................................................. 11
3.2 Solutions proposées ................................................................................................... 12
4 Processus de développement et méthodologies agiles ............................................. 13
4.1 Méthodologie agile .................................................................................................... 13
4.1.1 Notion d’agilité ................................................................................................................ 13
4.1.2 Quelques méthodes agiles .............................................................................................. 13
4.1.3 Méthodologie adoptée : SCRUM .................................................................................... 14
Conclusion ...................................................................................................................... 16
Analyse et spécification des besoins................................................................................ 17
Introduction ................................................................................................................... 18
1 Ressources .............................................................................................................. 18
1.1 Environnement matériel............................................................................................. 18
1.2 Moyens de communication ......................................................................................... 18
1.3 Contrôle de version (git) ............................................................................................. 19
1.4 Environnement de développement ............................................................................. 19
1.5 Environnement logiciel ............................................................................................... 22
1.6 Framework ................................................................................................................ 24
1.6.1 Choix de framework Back-end......................................................................................... 24
1.6.2 Choix de Framework Front-end ....................................................................................... 25
2 Spécification des besoins ......................................................................................... 26
2.1 Identification des acteurs ........................................................................................... 26
2.2 Besoins fonctionnels .................................................................................................. 27
2.3 Besoins non fonctionnels ............................................................................................ 27
3 Backlog Produit ....................................................................................................... 28
Conclusion ...................................................................................................................... 29
Préparation d’un socle Spring Boot/Angular pour une architecture micro-services .......... 30
Introduction ................................................................................................................... 31
1 Sprint 1 ................................................................................................................... 31
1.1 Backlog du premier sprint ........................................................................................... 31
1.2 Socle projet Angular ................................................................................................... 31
1.2.1 Modules ........................................................................................................................... 32
1.2.2 Core Module .................................................................................................................... 33
1.2.3 Shared Module ................................................................................................................ 33
iii
1.2.4 Lazy Loading..................................................................................................................... 33
1.2.5 Angular avec NGRX (PATTERN REDUX) ............................................................................ 33
1.3 Socle projet Spring Boot ............................................................................................. 34
1.3.1 Sous-projet base-core...................................................................................................... 35
2 Sprint 2 ................................................................................................................... 36
2.1 Backlog du deuxième sprint ........................................................................................ 36
2.2 Architecture logique de l’application .......................................................................... 36
2.2.1 Architecture monolithique .............................................................................................. 37
2.2.2 Architecture micro-services............................................................................................. 39
2.2.3 Architecture générale de notre ERP ................................................................................ 40
2.3 Intégration des micro-services .................................................................................... 41
2.3.1 Service de découverte ..................................................................................................... 41
2.3.2 API Gateway..................................................................................................................... 42
2.3.3 API serveur de configuration ........................................................................................... 43
2.4 Communication entre les micro-services.................................................................... 44
2.4.1 Communication synchrone.............................................................................................. 44
2.4.2 Communication asynchrone ............................................................................................ 44
Conclusion ...................................................................................................................... 45
Implémentation des diverses fonctionnalités communes .................................... 46
Introduction ................................................................................................................... 47
1 Sprint 3 ................................................................................................................... 47
1.1 Backlog du troisième sprint ........................................................................................ 47
1.2 Implémentation du protocole Oauth2 avec keycloak. .................................................. 48
1.2.1 Protocole OAuth2 ............................................................................................................ 48
1.2.2 Gestionnaires des identités et des accès........................................................................ 49
1.2.3 Keycloak ........................................................................................................................... 49
1.3 MSRef ........................................................................................................................ 56
1.3.1 Conception....................................................................................................................... 56
1.3.2 Réalisation ....................................................................................................................... 59
2 Sprint 4 ................................................................................................................... 60
2.1 Backlog du quatrième sprint ....................................................................................... 60
2.2 Conception................................................................................................................. 60
2.2.1 Digramme de cas d’utilisation ......................................................................................... 60
2.2.2 Description textuelle ....................................................................................................... 61
2.2.3 Diagrammes de séquence ............................................................................................... 63
2.2.4 Diagrammes de classe ..................................................................................................... 67
2.3 Réalisation ................................................................................................................. 70
Conclusion ...................................................................................................................... 72
Gestion d’intégration continue sur GitLab (devops) ............................................. 73
Introduction ................................................................................................................... 74
1 Backlog du cinquième sprint .................................................................................... 74
2 Devops .................................................................................................................... 74
3 Démonstration logique ............................................................................................ 75
3.1 Versions du code ........................................................................................................ 75
3.2 Phase de construction (Build) ..................................................................................... 76
iv
3.3 Test unitaire ............................................................................................................... 76
3.4 Déploiement .............................................................................................................. 76
3.5 Test automatique ....................................................................................................... 76
3.6 Déploiement en production ........................................................................................ 77
4 Préparation des conteneurs de déploiement (DOCKER)............................................ 77
5 Démonstration physique ......................................................................................... 79
5.1 Mise en place du pipeline ........................................................................................... 80
5.1.1 Stage check_style ............................................................................................................ 81
5.1.2 Stage unit-test ................................................................................................................. 82
5.1.3 Stage build ....................................................................................................................... 83
5.1.4 Stage docker build ........................................................................................................... 83
Conclusion ...................................................................................................................... 84
Conclusion générale ........................................................................................................ 85
Bibliographie .................................................................................................................. 86
v
Figure 29. Crée un nouveau mapper ........................................................................................ 56
Figure 30. Diagramme de cas d’utilisation .............................................................................. 57
Figure 31. Diagramme de séquence pour le fonctionnement de MSRef en invoquant la
méthode find ..................................................................................................................... 58
Figure 32. Diagramme de séquence pour le fonctionnement de MSRef en invoquant la
méthode save .................................................................................................................... 58
Figure 33. Diagramme de classe .............................................................................................. 59
Figure 34. Diagramme de cas d’utilisation pour les snapshots et les filtres avancés ............... 61
Figure 35. Diagramme de séquence pour soft-delete ............................................................... 64
Figure 36. Diagramme de séquence pour prendre un snapshot sur la mise à jour ................... 65
Figure 37. Diagramme de séquence pour les filtres avancés ................................................... 66
Figure 38. Diagramme de classe pour prendre un snapshot sur la mise à jour ........................ 67
Figure 39. Diagramme de classes pour la gestion des snapshot............................................. 68
Figure 40. Diagramme de class des filtres avancés .................................................................. 69
Figure 41. Structure JSON pour les filtres avancés ................................................................. 71
Figure 42. Architecture Devops ............................................................................................... 75
Figure 43. Version du code ...................................................................................................... 76
Figure 44. Architecture docker................................................................................................. 77
Figure 45. Architecture CI/CD ................................................................................................. 80
Figure 46. Pipeline ................................................................................................................... 81
Figure 47. Check_style ............................................................................................................. 81
Figure 48. Unit_test .................................................................................................................. 82
Figure 49. Publication d’une image docker eureka-server dans le registry de GitLab ...... 83
vi
Introduction générale
Au cours de ces dernières années, le développement Web a subi plusieurs changements
significatifs. De nouvelles technologies ont apparu en ajoutant plusieurs choix pour construire
des applications Web. De ce fait, coder une application Web aujourd'hui consiste à choisir les
bonnes technologies et la bonne architecture.
Cependant, les entreprises ont aujourd'hui une importante inertie qui les empêche d'intégrer
rapidement les nouveaux techniques et les nouveaux processus. Ses problèmes doivent, donc
être réduits au minimum, car l’indisponibilité immédiate des solutions a des impacts très
préjudiciables sur l’activité et sur la notoriété d’une entreprise.
C’est pour ça qu’on a besoin d’avoir un socle technique, en effet, un socle technique est un
ensemble des Framework, des conventions, d'outils et des procédures qui structurent le
développement d’un projet.
Le socle technique constitue un point de départ de chaque solution proposée par l’entreprise et
dans n’importe quel domaine d’application, à titre d'exemple le socle peut être exploité pour
démarrer un projet de gestion d’une entreprise, une application de processus de recrutement
etc...
Repartir donc, sur un socle bien maîtrisé et performant pour débuter un projet pouvant garantir
le succès, la rapidité et la performance de ce dernier.
C'est dans ce cadre, que se situe notre projet de fin d'études dont le but est de mettre en place
un socle technique javaEE/angular pour ASM qui sera à son tour utilisé pour développer un
ERP. Ce socle a pour objectif de mettre en place des parties et des fonctionnalités communes
entre les divers projets.
Le présent rapport décrit les différentes étapes de notre travail, et il s’articule autour de cinq
chapitres :
Dans le premier chapitre « Présentation du cadre de projet », nous expliquons le cadre
de projet.
Dans le deuxième chapitre « Analyse et spécification des besoins », nous determinons
les acteurs du futur système, les besoins fonctionnels, non fonctionnels et le backlog de
produit.
Dans le troisième chapitre « Préparation d’un socle Spring Boot/Angular pour une
architecture micro-services », nous détaillons les différentes étapes pour implémenter
un socle spring boot/angular.
Dans le quatrième chapitre « Implémentation des diverses fonctionnalités communes »,
nous expliquons les diverses fonctionnalités qu’on a implémenter au niveau de core du
projet spring boot.
Dans le dernier chapitre « Gestion d’intégration continue sur GitLab (devops) », nous
détaillons les étapes pour le mise en place d’un pipeline CI/CD.
8
Chapitre 1
Présentation du cadre de projet
9
Présentation du cadre de projet
Introduction
Le cadre général est une étape très importante dans la réalisation de n’importe quel produit ou
projet informatique. Elle nous permet de capturer les différents processus concernant la réalisation
du notre projet, et de mieux éclaircir les objectifs à réaliser afin d’atteindre le niveau estimé.
Ce chapitre a pour objectif de mettre le projet dans son contexte général. Dans la première
partie, nous donnons une brève présentation de l’organisme d’accueil « ASM » [1] Dans la
deuxième partie, nous présentons le cadre de projet. Enfin, nous exposons les méthodologies
adoptées lors de la réalisation de ce travail.
All Soft Multimédia est une société informatique créée en 2007 et elle est spécialisée dans
l’ingénierie logicielle, la création des sites web et le développement des applications mobile et
les systèmes de vente. Cette société est présentée en trois pays : Tunisie, Algérie et au Sénégal.
Depuis sa création, ASM conçoit à réaliser et maintenir des services informatiques sur mesure.
C’est pourquoi, elle assure que son travail soit effectué par une ressource humaine certifiée en
ingénierie informatique. Son travail est basé sur un ensemble d’activités, de la conception à la
mise en œuvre, pour réaliser un service informatique, contrôler son bon fonctionnement et son
adéquation au besoin. C’est aussi concevoir, développer et maintenir des applications destinées
au grand public telles que les sites ou portails Web, des sites de commerce électronique... En effet,
ASM analyse et spécifie les besoins et les exigences de ces clients. Par ailleurs, elle les
accompagne aussi dans la création et l’exploitation de nouveaux services.
10
Présentation du cade de projet
Au fur et à mesure d’expérience, ASM a développé et a validé ses outils et méthodes de travail,
afin de son modèle d’organisation réponde aux exigences de ses clients. Elle met à la disposition
de ses clients les services suivants :
Développement logiciel
Développement Web et Internet
Développement pour les mobiles (iPhone, J2ME, BlackBerry, Android, WinCE)
Développement de solutions SMS et MMS
Maintenance et Support
Test et Validation
2 Présentation de projet
Ce projet de fin d’études est réalisé dans le cadre de l’obtention du diplôme national d’ingénieur
en génie informatique à l’Institut international de technologie de Sfax pour l’année universitaire
2018/2019. Ce stage a été effectué au sein de la société ASM, encadré par M. Khaled Baklouti
et dédié à la réalisation du sujet « Préparation d’une architecture micro-services pour le
développement d’un ERP en mode SaaS ».
3 Etudes de l’existant
Dans cette section, nous présentons l’architecture des applications chez ASM ainsi que la
chaîne d’intégration et les processus de déploiement et de livraison, tout en mettant l’accent sur
leurs limites.
L’ERP existant cher ASM « DUX » est basé sur une architecture monolithique où tous les
composants et les processus métiers de l’application sont développés dans le cadre d’une même
technologie. Ce type d’application est constitué d’un seul bloc de code, et toutes les couches
communiquent entre elles via des appels de méthodes. Ce type d’application s’avère trop
complexe et assez coûteux à faire évoluer. Cette version ne fournit pas des services web,
manque encore d’autres fonctionnalités qui sont utiles pour les prochains projets et présente
certaines lacunes au niveau des performances de l’application. Parmi ces lacunes nous pouvons
citer :
11
Présentation du cade de projet
1. Processus de déploiement chez ASM : Les fichiers sont de taille supérieur à 700 Méga
Octets, leur téléchargement par les clients prend généralement quelques heures. Il
faudra, ensuite, installer l’environnement nécessaire pour le bon fonctionnement de
l’application SQL Server, dot net Framework et réglage de réseaux.
2. Processus de livraison chez ASM : La livraison dans un contexte habituel se fait avec
des scripts manuelles sur l’environnement du client et hors la chaîne DevOps.
3. Absence du monitoring : Le dernier constat, est la visibilité générale de l’état des
systèmes. Actuellement, il n’existe aucun moyen pour ASM pour s’assurer que les
différents environnements (Production, Pré production, Développement) soient en
bonne santé.
4. Absence d’archivage : Absence d’une archive complète de toutes les activités de
l’application, qui permet de suivre le déroulement de chaque activité, comprendre le
fonctionnement de l’application ou résoudre les anomalies.
Après une étude de l’existant chez ASM, et après avoir dégager les problèmes omniprésents,
notre solution consiste à intervenir dans plusieurs volets :
1. Architecture microservices : Afin d’adapter ses applications à la clientèle, ASM doit
migrer toutes ses applications vers l’architecture microservices pour se bénéficier de
l’atout majeur de cette architecture qui est la réutilisation, d’où notre premier objectif,
qui est le développement d’une architecture microservices afin de résoudre plusieurs
problèmes présents dans l’architecture monolithique.
2. Chaîne d’intégration basée sur GitLab : Notre solution intervient aussi dans le
changement de l’outil de gestion de code source dans la chaîne d’intégration continue
chez ASM. Nous allons introduire Git afin de se bénéficier des avantages de GitLab (la
rapidité, une interface plus compréhensible).
3. Déploiement et livraison automatisés : Nous souhaitons déployer automatiquement
tout changement effectué qui a réussi une chaine de tests préalablement mis en place
sur le serveur de pré production (pour le déploiement) et le serveur de production (pour
la livraison).
4. Monitoring : Une fois ces trois pipelines (intégration continue, déploiement continu et
livraison continue) sont mis en place et intégrés entre eux, un tableau de bord permettant
le monitoring et le contrôle des systèmes sera affiché selon les besoins.
12
Présentation du cade de projet
Pour assurer le succès d’un projet, il faut principalement fixer un plan de travail bien détaillé et
bien étudié avant de commencer son développement. La phase de développement doit être
réalisée d’une manière consciencieuse et appliquée, mais l’essentiel ne pas perdre ou modifier
des informations entre le besoin spécifié par le client et ce qui est finalement développé. C’est
pourquoi il est très important de fixer une méthodologie de travail avant le début de tout projet.
Dans le cadre de ce projet, nous nous sommes intéressées à l’adoption d’une approche Agile.
Une méthode agile [2] est une approche itérative et incrémentale, qui est menée dans un esprit
collaboratif, avec juste ce qu’il faut de formalisme. Elle génère un produit de haute qualité tout
en prenant en compte l’évolution des besoins des clients. Ce sont des méthodologies
essentiellement dédiées à la gestion de projets informatiques. Elles reposent sur des cycles de
développement itératifs et adaptatifs en fonction des besoins évolutifs du client.
Le terme agilité désigne des projets qui ont adopté le manifeste agile et qui ont fait usage
d’utilisateurs finaux comme source des exigences donc ils ont utilisé des histoires d’utilisateurs.
Dans le contexte projet, être agile c’est être capable de s’adapter au changement. Que ce soit
des changements de besoins, de priorités, de technologies, ou d’équipe projet.
Les méthodes agiles permettent généralement de mieux répondre aux attentes du client en un
temps limité tout en faisant monter les collaborateurs en compétences. Ces méthodes
constituent donc un gain en productivité ainsi qu’un avantage compétitif tant du côté du client
que du côté du fournisseur.
On citera comme méthodes de développement Agile :
Scrum
La méthode XP (Extreme Programming)
La méthode Kanban
13
Présentation du cade de projet
La méthodologie choisie pour la réalisation de ce projet est la méthode SCRUM [3]. Ce choix
est parvenu suite à nos études sur les méthodes agiles car nous avons constaté qu’elle est la plus
utilisée parmi ces méthodes, elle est donc la plus éprouvée, documentée et supportée. En effet,
SCRUM nous offre un cadre de travail en équipes pluridisciplinaires intégrées et soudées dans
une stratégie flexible, léger et simple à comprendre.
SCRUM est une méthode agile dédiée à la gestion de projets. Son objectif est d’améliorer la
productivité des équipes. Elle ne propose aucune pratique de développement, juste des pratiques
de management et d’organisation du travail. SCRUM est la méthodologie la plus utilisée parmi
les méthodes agiles existantes. Elle est considérée comme un Framework ou cadre de travail
permettant de répondre à des problèmes complexes et changeants au cours du temps. Ce cadre
propose une définition des rôles, de réunions et d’artefacts.
SCRUM est un processus qui se base sur l’expérience du terrain. Il s’appuie sur trois piliers :
Transparence
Adaptation
Inspection
14
Présentation du cade de projet
SCRUM comporte 4 étapes importantes qui vont être effectuées pour chaque Sprint :
Sprint Planning : toute l’équipe se réunit pour décider des fonctionnalités qui vont
composer le sprint suivant et mettre à jour la liste générale.
Le SCRUM quotidien : est effectué pour identifier les problèmes rencontrés et pour
répondre à 3 questions essentielles :
o Qu’est-ce que j’ai fait hier ?
o Qu’est-ce que je fais aujourd’hui ?
o Quels sont les problèmes rencontrés ?
Sprint Review : à la fin du sprint, l’équipe SCRUM et les parties prenantes invitées se
réunissent pour effectuer la revue de sprint. L’objectif de celle-ci est de valider
l’incrément de produit qui a été réalisé pendant le sprint.
Rétrospective du sprint : Cette étape s’effectue à chaque fin de Sprint. Elle a pour objectif
de réfléchir régulièrement à ce qui marche et ce qui ne marche pas. Pour cela l’équipe
prend en général 15 à 30 minutes pour se réunir et faire un point.
15
Présentation du cade de projet
Conclusion
Dans ce chapitre, nous avons commencé avec la présentation de l’organisme d’accueil dans
lequel nous avons effectué notre projet de fin d’études. Puis, on a décrit la méthodologie de
conduite de projet adoptée. Dans le chapitre suivant, on entame la partie analyse et spécification
des besoins.
16
Chapitre 2
Analyse et spécification des besoins
17
Analyse et spécification des besoins
Introduction
Ce chapitre présente le sprint zéro qui représente le premier pas de réalisation de notre projet.
Tout d’abord, nous donnons un bref aperçu sur les technologies et les langages de programmation
utilisés pour la mise en place de l’environnement de travail. Puis, nous identifions les acteurs
de notre application. En fin, nous listons les besoins fonctionnelles et non fonctionnelles de notre
système et nous détaillons le travail par la méthodologie choisie dans le chapitre précédent.
1 Ressources
Nous présentons dans cette section les choix techniques relatifs à l’environnement matériel et
logiciel qui ont contribué à la mise en place de notre socle technique.
Durant le projet, le travail a été réalisé sur un ordinateur qui présente les caractéristiques
suivantes :
Processeur: Core i7 2.70GHz × 4
Mémoire RAM: 12GB
Type système: 64 bits
Disque Dur: 1 TB
System d’exploitation: Ubuntu 18.04.2 LTS
En travaillant dans la même salle de développement, ou en étant connecté avec différents moyens
de communication, l’équipe peut facilement partager des documents et échanger les informations
nécessaires. Parmi les moyens de communication :
Chaque journée de travail commence par une réunion de 15 minutes
Discuter de tout obstacle et partager les solutions dans le groupe Mattermost
Nous clôturons la journée de travail avec un texte dans le groupe de "réunion"
Mattermost pour le suivi quotidien
Une réunion toutes les deux semaines
18
Analyse et spécification des besoins
Git [4] est un système de contrôle de version distribué gratuit et open source conçu pour gérer
efficacement les projets de toutes tailles avec rapidité et efficacité. Git est facile à apprendre et a
une empreinte minuscule avec excellentes performances.
Nous énumérons au cours de cette partie les différents outils et technologies employés tout au
long de la réalisation de notre projet.
JAVA 8 :
Java 8 [5] C’est la 8ème version de JAVA (JAVA SE 8) un langage de programmation orienté
objet. La particularité et l’objectif central de Java est que les logiciels écrits dans ce langage
doivent être très facilement portables sur plusieurs systèmes d’exploitation tels que Unix,
Windows, Mac OS ou GNU/Linux, avec peu ou pas de modifications. Pour cela, divers
plateformes et Framework associés visent à guider, sinon garantir, cette portabilité des
applications développées en Java.
19
Analyse et spécification des besoins
TypeScript :
TypeScript [6] est un langage compilé et typé qui génère du JavaScript compréhensible par tous
les navigateurs. TypeScript permet d’associer un type à un élément et empêche cet élément de
changer de type. Cela offre une stabilité au niveau du code, dès lors il est possible d’anticiper
le type d’un élément, et ses différentes valeurs possibles.
HTML:
L’HyperText Markup Language, généralement abrégé HTML, est le langage de balisage conçu
pour représenter les pages web. C’est un langage permettant d’écrire de l’hypertexte, d’où son
nom. HTML permet également de structurer sémantiquement et logiquement et de mettre en
forme le contenu des pages, d’inclure des ressources multimédias dont des images, des
formulaires de saisie et des programmes informatiques. Il permet de créer des documents
20
Analyse et spécification des besoins
interopérables avec des équipements très variés de manière conforme aux exigences de
l’accessibilité du web.
CSS :
Les feuilles de style en cascade1, généralement appelées CSS de l’anglais Cascading Style
Sheets, forment un langage informatique qui décrit la présentation des documents HTML et
XML. Les standards définissant CSS sont publiés par le World Wide Web Consortium (W3C).
Introduit au milieu des années 1990, CSS devient couramment utilisé dans la conception de
sites web et bien pris en charge par les navigateurs web dans les années 2000.
MongoDB :
MongoDB [7] (de l’anglais humongous qui peut être traduit par « énorme ») est un système de
gestion de base de données orientée documents, répartissable sur un nombre quelconque
d’ordinateurs et ne nécessitant pas de schéma prédéfini des données.
21
Analyse et spécification des besoins
IntelliJ IDEA :
Pour développer ce projet, nous avons utilisé IntelliJ IDE, un logiciel de développement
multiplateformes développé par JetBrains. Sa dernière version est appelée IntelliJ IDEA 2019.
L’IntelliJ IDEA est un ensemble complet d’outils de développement permettant de générer des
applications Web Spring, des services Web XML, des applications de bureau et des applications
mobiles.
JetBrain WebStorm :
WebStorm est un IDE pour les langages Web (HTML, CSS et JavaScript), développé par
l’entreprise JetBrains et basé sur la plateforme IntelliJ IDEA. L’éditeur offre diverses
fonctionnalités y compris éditeur javaScript, débogueur, prise en charge de [Link] comme il
supporte le langage typescript, Dart.
22
Analyse et spécification des besoins
Redmine :
Redmine est un outil collaboratif permettant, à travers une interface web sécurisée, de gérer des
projets. Il a été créé par Jean-Philippe Lang en 2006. Redmine offre les fonctionnalités
suivantes :
Gestion multi-projets sécurisée
Gestion des utilisateurs, des profils et des droits, en fonction de chaque projet
Gestion de documents, classement par catégorie, propriétaire, titre, date, etc
Gestion des demandes, de leur statut, de leur priorité et de leur historique, assignation
de ces demandes aux acteurs pertinents du projet.
Postman :
Pour tester nos services Web avant de les appeler dans le code de l’application, nous avons utilisé
Postman, un outil permettant de créer et de tester rapidement des requêtes HTTP. Il permet
l’exécution d’appels HTTP vers un serveur pour interpréter la réponse.
23
Analyse et spécification des besoins
[Link] :
[Link] pro est une application création de diagrammes compatible avec Google Drive(TM) et
entièrement gratuite nous permettant de dessiner : Des organigrammes, des diagramme UML
et Business Process Models . . .
1.6 Framework
Avec une architecture Microservices, chaque Microservice peut être développé avec une
technologie différente. En raison de l’expérience de l’équipe, Nous avons décidé de développer
les Microservices avec la technologie Java/JEE. Par ailleurs, il existe trois Framework
populaires pour développer une application en Microservices : Dropwizard, Spring et WildFly
Swarm. Dans notre étude, nous somme intéressé seulement au Framework le plus mature Spring
Boot.
24
Analyse et spécification des besoins
C’est un Framework java créé par l’équipe Pivotal qui permet de simplifier le démarrage et le
développement de nouvelles applications Spring en réduisant la complexité de configuration.
Spring Boot [7] offre les avantages suivants :
Faciliter la création des applications Spring
Offrir un serveur d’application intégré (Tomcat, Jetty), donc nous n’avons pas besoin
de la déployer en tant que fichier war.
Fournir un "starter" POM pour simplifier la configuration Maven.
Pas de fichiers XML à configurer.
En raison de l’expérience de l’équipe, Nous avons décidé d’utiliser le Framework Angular. Par
ailleurs, il existe trois Framework populaires : Angular, VueJs et React. Dans notre étude, nous
nous somme intéressé seulement au Framework Angular.
Angular [8] est une plate-forme qui facilite la création d’applications Web. Angular combine
des modèles déclaratifs, une injection de dépendance, un outillage de bout en bout et des
meilleures pratiques intégrées pour résoudre les problèmes de développement.
25
Analyse et spécification des besoins
Dans cette section, nous définissons en détails l’ensemble des fonctionnalités offertes par notre
application. Nous commençons par l’identification des acteurs suivie par la présentation des
besoins fonctionnels relatifs à ces acteurs ainsi que les besoins non fonctionnels.
26
Analyse et spécification des besoins
Notre Projet ayant comme objectif l’implémentation d’une architecture en microservices pour
développer un ERP, en plus de plusieurs autres fonctionnalités qui visent à minimiser le rôle
technique du développeur pour se concentrer uniquement au métier.
Les fonctionnalités dont le système doit assurer :
La livraison et le déploiement continus de grandes applications complexes.
Localisation d’un service : lorsqu’un client veut faire une requête vers un service,
ce dernier doit être facilement localisé. (Par la définition d’un seul point d’entrée au
système).
Communication entre les services.
Environnement de sécurité avec le protocole oauth2
Interface de filtrage de données avancée.
Automatiser la sauvegarde et la récupération de documents d'autres micro-services.
Gestion des snapshots.
27
Analyse et spécification des besoins
3 Backlog Produit
Le Backlog est un artéfact très important dans SCRUM. C’est l’ensemble des caractéristiques
fonctionnelles ou techniques qui constituent le produit souhaité. Le tableau 2 présente le
backlog de notre produit.
ID qui représente l’identifiant de la user story. User Story comporte la description des user story
suivant le forme « En tant que . . . Je veux . . . ». L’estimation comporte la valeur de la durée
estimée pour terminer la user story selon la complexité.
Tableau 1. Backlog produit
28
Analyse et spécification des besoins
Conclusion
Dans ce chapitre nous avons décrit les acteurs, les besoins fonctionnels, non fonctionnels et le
Backlog produit. Dans le chapitre suivant, on entame la partie de la mise en place de notre
architecture.
29
Chapitre 3
Préparation d’un socle Spring Boot/Angular
pour une architecture micro-services
30
Préparation d’un socle Spring Boot/Angular pour une architecture micro-services
Introduction
Dans ce chapitre nous visons à détailler les deux premiers sprints dans le but d'implémenter un
socle spring boot/angular et la mise en place de l'architecture micro-services.
1 Sprint 1
ID Tâche Estimation
1 En tant que développeur, je veux une architecture du socle du 9 jours
projet Angular
2 En tant que développeur, je veux faciliter la manipulation de
données entre les composants et service ANGULAR et les
centraliser dans un objet global.
3 En tant que développeur, je veux une architecture du socle du
projet Spring
Dans le but d’avoir une structure de dossiers hautement évolutive pour notre projet Angular on
a appliqué l’architecture suivante présenter par la figure 15.
31
Préparation d’un socle Spring Boot/Angular pour une architecture micro-services
1.2.1 Modules
32
Préparation d’un socle Spring Boot/Angular pour une architecture micro-services
CoreModule assume le rôle de racine AppModule, mais n’est pas le module qui est démarré
par Angular au moment de l’exécution. Le CoreModule doit contenir des services singleton des
composants universels et d’autres fonctionnalités dans lesquelles il n’y a qu’une seule instance
par application par exemple (footer, header, interceptors, etc). Pour éviter de réimporter le
module principal ailleurs, nous avons également lui ajouter une protection dans le constructeur
du module principal.
L’application utilise le chargement paresseux, ce qui signifie que le module n’est pas chargé
avant que l’utilisateur n’accède à la route. En utilisant la structure décrite dans la section
« Modules », nous pouvons facilement référencer chaque module dans notre fichier de routage
d'application principal.
NGRX propose une conception du développement d’applications qui tourne autour des actions
utilisateurs et serveur. L’objectif est de supprimer la manipulation de données entre les
composants et service Angular pour les centraliser dans un objet global, qu’on pourra modifier
seulement via des actions typées.
[Link] Redux
33
Préparation d’un socle Spring Boot/Angular pour une architecture micro-services
actions distribuées par le serveur ou par l’utilisateur. Il conserve la nouvelle instance d’une
donnée dans un ou plusieurs stores qui mettent à jour la vue.
Redux est une version moins complexe de Flux. Il se distingue en plusieurs points :
Un store, donc une source de données.
Des états immuables (qui ne peuvent changer).
Pas de dispatcher.
Le store est une fonction qui contient l’état des reducers, un getter, une fonction de dispatch et
des subscribers. Elle utilise les Observables pour communiquer la mise à jour des états dans les
composants Angular.
Spring Boot est un Framework java qui facilite la création d'applications basées sur Spring en
offrant plusieurs fonctionnalités :
Spring Initializr : un outil qui fournit des projets Spring boot en générant les fichiers
de base d’un projet. Cet outil expose une interface web et une interface incluse dans des
IDE comme Intellij Idea, STS et NetBeans.
Serveur intégré : Tomcat, Jetty ou Undertow est déjà intégré dans une application
Spring boot.
Auto-configuration : Spring boot est basée sur le principe que la convention plutôt
que configuration. Il utilise les conventions pour configurer par défaut l’application en
se basant sur les dépendances incluses dans le Classpath. Cette configuration est non
invasive, nous pouvons définir notre propre configuration pour remplacer des parties de
la configuration automatique. Toutefois, en ajoutant une configuration d’une
dépendance, la configuration automatique de cette dernière sera ignorée.
Fonctionnalités de production : des fonctionnalités de production peuvent être
directement en marche.
34
Préparation d’un socle Spring Boot/Angular pour une architecture micro-services
Vue qu’on veut implémenter une architecture micro-services il faut penser à une architecture
qui permet de partager les fonctionnalités communes entre les différents services. C’est pour ça
on a créé un sous projet de classe sans classe principale, avec toutes les configurations, classes
et dépendances communes entre les microservices. Le sous-projet est situé dans le git et inclus
dans les micro-services à l’aide de gradle.
Le rôle de cette couche est d’assurer la communication avec la base de données. Nous avons
décidé de modifier le fonctionnement de couche dao qui était offert par Spring Framework pour
ajouter des fonctionnalités ciblées. En étudiant le fonctionnement du projet Spring Data
MongoDB on a conclu que nous devons réimplémenter seulement la classe
SimpleMongoRepository qui offre par défaut l’implémentation des méthodes d’ajout, de
modification, de suppression et de consultation des données. Notre réimplémentation ajoute
aux méthodes de cette classe les fonctionnalités suivantes :
Le rôle de cette couche est d’implémenter les fonctionnalités supplémentaires avant de les
passer vers le contrôleur. Ce code peut être une validation ou des calculs personnalisés. Dans
ce cadre, nous implémentons une classe générique de cette couche qui offre des méthodes
35
Préparation d’un socle Spring Boot/Angular pour une architecture micro-services
2 Sprint 2
ID Tâche Estimation
4 En tant que développeur, je veux pouvoir prépare l’architecture 9 jours
micro-services
5 En tant que développeur, je veux pouvoir implémenter un
service de découvert (Eureka server)
6 En tant que développeur, je veux pouvoir
implémenter un service de configuration (Config server)
7 En tant que développeur, je veux pouvoir
implémenter une passerelle (Zuul Gateway)
8 En tant que développeur, je veux pouvoir une commination
asynchrone
Les micro-services sont un style d’architecture logicielle à partir duquel un ensemble complexe
d’applications est décomposé en plusieurs processus indépendants et faiblement couplés,
souvent spécialisés dans une seule tâche.
Les processus indépendants communiquent les uns avec les autres en utilisant des API.
Les API REST sont souvent employées pour relier chaque micro-service aux autres.
Avec cette architecture chacun peut pratiquer ses propres traditions de développement. En effet
il ne s’agit pas de séparer les gros projets en sous-projet mais de projets indépendants, chacun
a son organisation, son calendrier, sa base de code et ses données ce qui n’est pas le cas d’une
architecture monolithique. Les échanges entre les projets se font par des services, qu’il s’agisse
d’appels de services (REST / JSON) ou de messages.
36
Préparation d’un socle Spring Boot/Angular pour une architecture micro-services
Une application monolithique est une application qui, centralise tous les besoins, dans un seul
bloc applicatif, où toutes les couches communiquent entre elles par des appels de méthodes et
elle est réalisée avec une seule technologie. La figure 16 illustre l'architecture monolithique.
C’est vrai que ces applications sont un modèle simple à coder et à déployer surtout pour les
développeurs mais la difficulté ici s’impose notamment dans la maintenance. Nous consacrons
particulièrement le paragraphe suivant pour l’étude des limites qu’une application monolithique
peut présenter.
37
Préparation d’un socle Spring Boot/Angular pour une architecture micro-services
Tout système informatique devra garantir son évolutivité et sa maintenabilité, surtout que les
besoins et les exigences fonctionnelles du client se développent au fur et à mesure. Dans une
application classique, tout changement nous conduira vers un système plus complexe. Encore
plus, pour chaque modification nous devrons accéder, dans certains cas, tout le système et relire
presque tout le code ce qui affecte généralement la qualité de code d’une part et rend la
maintenance difficile et pénible pour l’ingénieur d’autre part. Nous pouvons aller plus loin que
ceci, après cette modification, nous devrons tout redéployer parce que notre monolithique est
un seul bloc applicatif, donc tout changement, même s’il est minime, conduira à un déploiement
complet de toute l’application.
C’est vrai que, les architectures classiques ont fait leurs preuves dans plusieurs projets, mais à
un moment donné elles deviennent trop coûteuses à faire évoluer d’où l’essor d’un style
architectural : les micro-services qui répond idéalement à cette problématique.
38
Préparation d’un socle Spring Boot/Angular pour une architecture micro-services
L’approche micro-services est une approche qui est totalement différente des applications
monolithiques dans la conception, le développement et aussi dans le déploiement. En effet, une
architecture micro-services est un style architectural logiciel qui décompose les applications
complexes en des processus élémentaires, spécialisés pour une seule fonctionnalité.
La décomposition des processus dépend bien évidemment du métier de l’application et de sa
complexité. Ce design est apparu pour résoudre les problèmes que présentent les applications
monolithiques, décrits dans le paragraphe précèdent.
En explosant le monolithique, l’application devient une série de services indépendants, chacun
codé par le langage le plus adéquat, testé et déployé indépendamment des autres. Ces services
sont des entités communicantes via des API. Et c’est ici que l’enjeu de l’architecture micro-
services persiste, c’est à dire que la décomposition en un ensemble d’unités fonctionnelles joue
un rôle majeur dans la réussite d’une telle conception. La figure 17 illustre l'architecture micro-
services.
39
Préparation d’un socle Spring Boot/Angular pour une architecture micro-services
La principale caractéristique des micro-services est qu’ils sont des unités fonctionnelles
logiques de grande précision, chacun exprime un processus autonome, responsable d’une seule
fonctionnalité. Et par conséquent, il sera facile de détecter et de remplacer un service défectueux
sans perturber les autres services.
Les micro-services se distinguent aussi par leur exploitation des capacités des différentes
technologies dans une seule architecture micro-services pour, bien évidemment, réaliser des
fins spécifiques. En fait, grâce à l’isolation des services nous pouvons basculer facilement d’une
technologie à une autre.
L’architecture micro-services permet sans peine une mise à l’échelle, ce que les architectes
estiment un avantage capital de ce style architectural. En effet, lorsqu’un besoin critique en une
ressource s’aperçoit, seul le micro-service lié sera augmenté. Contrairement aux applications
classiques où la mise à l’échelle est couteuse.
Après avoir étudié les avantages du choix technique d’utiliser une architecture de micro-
services, nous devons avoir une vision globale de l’architecture cible et leur son
fonctionnement. La figure 18 illustre l’architecture qui résume la structure technique de
l’application.
40
Préparation d’un socle Spring Boot/Angular pour une architecture micro-services
Dans une architecture micro-services les services doivent se trouver et communiquer les uns
avec les autres. C’est le service de découverte qui gère la façon d’enregistrement et de
41
Préparation d’un socle Spring Boot/Angular pour une architecture micro-services
localisation des micro-services déployés. Nous avons choisi le service de découverte Eureka
2.0 de Netflix qui est un Framework de service de découverte conçu pour les déploiements
Cloud. Eureka est un système très stable.
Les instances des micro-services enregistrés chez le service de découverte Eureka sont présenté
par la figure 19.
42
Préparation d’un socle Spring Boot/Angular pour une architecture micro-services
Un serveur de configuration encore appelé "Config Server" qui permet de centraliser les fichiers
des configurations de chaque micro-service dans un simple dépôt Git. Ceci permet d’avoir une
configuration partagée et évolutive indépendamment des applications. Au démarrage, chaque
micro-service récupère ses propriétés et sa configuration auprès du serveur de configuration
comme le montre la figure 21.
43
Préparation d’un socle Spring Boot/Angular pour une architecture micro-services
Les micro-services sont autonomes. Mais, ils ont besoins d’échanger des données pour réaliser
quelques fonctionnalités. Dans une architecture en micro-services chaque micro-service gère
ses propres données et ne les partage pas directement avec d’autres services. C’est pourquoi
nous avons réalisé des intercommunications synchrones via des protocoles ouverts et
asynchrones via un service de file d’attente de messages.
Un micro-service dans l’ERP nécessite des données métiers à partir d’un autre micro-service
pour compléter le traitement. En raison des exigences de temps de réponse pour ce micro-
service nous avons favorisé les communications asynchrones. Afin de choisir le service de file
d’attente de message le plus adéquat nous avons réalisé plusieurs recherches sur les leaders de
marché. Nous avons constaté la performance de rabbitMq par rapport à activeMq et la
performance d’Apache Kafka par rapport à rabbitMq ceci est présenté dans le tableau 5.
Cependant, l’utilisation de système de messagerie distribué Apache Kafka nécessite une
utilisation de service de découverte d’Apache « Zookeeper ». Ce service permet aux instances
Kafka de communiquer entre eux. Par conséquent, nous avons utilisé le service de file d’attente
Apache Kafka qui répond suffisamment aux besoins.
44
Préparation d’un socle Spring Boot/Angular pour une architecture micro-services
Conclusion
Dans ce chapitre nous avons préparé l’architecture du socle Spring Boot /Angular ainsi que
l’architecture micro-services. Dans le chapitre suivant nous allons implémenter les différentes
fonctionnalités communes pour tous les micro-services.
45
Chapitre 4
46
Implémentation des diverses fonctionnalités communes
Introduction
Dans ce chapitre, est après avoir implémenté un socle spring boot/angular, nous visons à
détailler le troisième et le quatrième sprint qui ont pour objectif de mettre en place un système
d’authentification avec keycloak, automatiser les sauvegardes et les récupérations des données
d’autre micro-services et la gestion des snapshot et des évènements.
1 Sprint 3
ID Tâche Estimation
9 En tant que développeur, je veux pouvoir implémenter le 14 jours
protocole OAuth 2.0 avec Spring Security et keycloak
10 En tant que développeur, je veux pouvoir récupérer les
informations de l'utilisateur à partir du keycloak token
11 En tant que développeur, je veux pouvoir implémenter le
protocole OAuth 2.0 avec Angular et keycloak
12 En tant que développeur, je veux une implémentation du multi
tenancy
13 En tant que développeur, je veux pouvoir automatiser la
sauvegarde et la récupération de documents d'autres
microservices.
47
Implémentation des diverses fonctionnalités communes
Dans cette partie nous présenterons le protocole Oauth2 ainsi que le gestionnaire d’identité
keycloak.
Vu que chaque service est une application indépendante, on a besoin d’unifier l’authentification
pour tous les services, ce processus doit être externalisé, ce qui veut dire que la gestion des
droits d’accès doit être implémentée dans un service dédié, appelé serveur d’autorisation.
OAuth2: Ce protocole permet à des applications tierces d’obtenir un accès limité à un service
disponible via HTTP par le biais d’une autorisation préalable du détenteur des ressources.
L’accès est demandé par ce qu’on appelle « un client », et qui peut être un site internet ou une
application mobile par exemple. Si les ressources n’appartiennent pas au client, alors ce dernier
doit obtenir l’autorisation de l’utilisateur final, sinon il peut directement obtenir l’accès en
s’authentifiant avec ses propres identifiants.
Pour bien comprendre ce processus, OAuth2 définit 4 rôles :
Le détenteur des données (Resource Owner) : C’est l’utilisateur qui autorise une
application à accéder à son compte. L’accès de l’application au compte de l’utilisateur
est limité à la portée de l’autorisation accordée.
Le serveur de ressources (Resource Server) : serveur qui héberge les don- nées dont
l’accès est protégé (par exemple Google qui stocke les informations de chaque profil).
Le client (Client Application) : une application demandant des données aux serveur
de ressources (cela peut être une application Java côté serveur, une application
JavaScript côté client ou une application mobile par exemple).
Le serveur d’autorisation (Authorization Server) : serveur qui délivre des tokens (ou
jetons) au client. Ces tokens seront utilisés lors des requêtes du client vers le serveur de
ressources. Ce serveur peut être le même que le serveur de ressources (physiquement et
applicativement), et c’est souvent le cas.
La figure 22 explique le cheminement nécessaire pour qu’un utilisateur puisse donner accès à
une ressource.
48
Implémentation des diverses fonctionnalités communes
La Gestion des Identités et des Accès est l’ensemble des processus mis en œuvre par une entité
pour la gestion des habilitations de ses utilisateurs à son système d’information ou à ses
applications. Il s’agit donc de gérer qui a accès à quelle information. Cela implique ainsi
d’administrer la création, la modification, et les droits d’accès de chaque identité numérique
interagissant avec les ressources de l’entité.
1.2.3 Keycloak
Keycloak [10] est une solution open source de gestion des identités (identity manager) et des
accès destinés aux applications et aux services modernes. Cela facilite la sécurisation des
applications et des services Il offre un large éventail de fonctionnalités, telles que la connexion
unique, l’authentification et l’autorisation, la connexion sociale, l’authentification
multifactorielle et la gestion centralisée des utilisateurs. On a choisi keycloak pour plusieurs
raisons:
Prix : la solution d’authentification la moins chère du marché.
49
Implémentation des diverses fonctionnalités communes
50
Implémentation des diverses fonctionnalités communes
51
Implémentation des diverses fonctionnalités communes
Il est nécessaire de connaître certains concepts et termes clés avant d’essayer d’utiliser
Keycloak pour sécuriser nos applications Web et nos services REST :
Utilisateurs : Ils sont des entités pouvant se connecter à notre système
Rôles : ils identifient un type ou une catégorie d’utilisateur. Admin, user, etc.
Groupe : permet de gérer un groupe d’utilisateur.
Royaumes (realms): un domaine qui gère un ensemble d’utilisateurs, d’informations
d’identification, des rôles et des groupes.
Clients : ils sont des entités pouvant demander à Keycloak d’authentifier un utilisateur
(comme des applications).
Token : un token qui fournit des informations d’identité sur l’utilisateur
Access token : un token pouvant être fourni dans le cadre d’une requête HTTP
autorisant l’accès au service invoqué.
Après avoir installé keycloak chez le server du ASM, on propose de suivre les étapes suivantes :
Crée compte admin : Pour pouvoir configurer Keycloak, il nous faut un compte admin
que nous pouvons créer via la console d’administration comme le montre la figure 24.
Création d’un domaine/realm Keycloak : Le concept de base dans Keycloak est un
royaume. Un domaine sécurise et gère les métadonnées de sécurité pour un ensemble
d'utilisateurs, d'applications et de clients OAuth enregistrés. La figure 25 illustre la
création d’un realm.
Configuration d’un realm : Dans notre configuration, nous avons choisi l’option User
registration, Forgot password et Login with email, comme le montre la figure 26.
Ajout d’un client : Dans la figure 27 nous avant présenter l’ajout d’un client erp-app
qui est notre application.
Configuration du client : Indiquez le chemin d’accès de notre application dans l’URL
de redirection valide comme le montre la figure 28.
52
Implémentation des diverses fonctionnalités communes
53
Implémentation des diverses fonctionnalités communes
54
Implémentation des diverses fonctionnalités communes
55
Implémentation des diverses fonctionnalités communes
Keycloak est un gestionnaire d’identité pour toute l’application. Pour ce but là on a configuré
Keycloak dans un sous-projet nommer base-core qui est implémentée par tous les services. Au
niveau de sous-projet, on a créé une interface keycloakhelper où on a défini tous les methodes
qu’on a besoin pour accéder aux informations de l’acteur. On a aussi créé une class
KeycloakConfig où on a défini la création du bean keycloakhelper (comme auto configuration)
1.3 MSRef
1.3.1 Conception
56
Implémentation des diverses fonctionnalités communes
57
Implémentation des diverses fonctionnalités communes
58
Implémentation des diverses fonctionnalités communes
La Figure 33 illustre le diagramme de classe qu’on a réalisé pour qu’on puisse implémenter la
logique de l’annotation MSREF.
1.3.2 Réalisation
Comme BDRef, annotation crée par mongoBD, référence un document à un autre dans la même
base de donnée, on a créé MSRef qui référence un document a un autre dans des bases de
donnée différente (autre microservice). MSRef est une annotation d’attribut qui prend en
paramètre le nom du microservice et le end-point d’un web service qu’on veulent le
consommer. Spring Data MongoDB publie des évènements de cycle de vie très utiles dans la
classe AbstractMongoEventListener, tels que onBeforeConvert, onBeforeSave, onAfterSave,
onAfterLoad et onAfterConvert. On a créé une abstraction de cette classe pour implémenter la
logique de notre annotation.
59
Implémentation des diverses fonctionnalités communes
2 Sprint 4
ID Tâche Estimation
14 En tant qu'administrateur, je veux avoir une visibilité sur 14 jours
l'historique des documents.
15 En tant qu'administrateur, je veux avoir une visibilité sur les
documents supprimer.
16 En tant que développeur, je veux une interface de filtrage de
données avancée
2.2 Conception
La figure 34 illustre le diagramme de cas d’utilisation pour la gestion des snapshots et les filtres
avancés
60
Implémentation des diverses fonctionnalités communes
Figure 34. Diagramme de cas d’utilisation pour les snapshots et les filtres avancés
61
Implémentation des diverses fonctionnalités communes
62
Implémentation des diverses fonctionnalités communes
Scénario L'acteur appelle la méthode find avec une date-heure spécifique et reçoit
principal un snapshot de la collection demandée.
63
Implémentation des diverses fonctionnalités communes
64
Implémentation des diverses fonctionnalités communes
Figure 36. Diagramme de séquence pour prendre un snapshot sur la mise à jour
65
Implémentation des diverses fonctionnalités communes
66
Implémentation des diverses fonctionnalités communes
Figure 38. Diagramme de classe pour prendre un snapshot sur la mise à jour
67
Implémentation des diverses fonctionnalités communes
68
Implémentation des diverses fonctionnalités communes
69
Implémentation des diverses fonctionnalités communes
2.3 Réalisation
Pour ne pas répéter la même logique dans la méthode de sauvegarde de chaque service, Il faut
commencer par automatiser l’enregistrement des snapshot lors de la mise à jour. Pour cette
raison, nous avons trouvé deux solutions possibles:
Surcharger (Override) la méthode de sauvegarde (save) du repository mongo
Utilisation du mongo repository event listener pour enregistrer un snapshot avant de
mettre à jour le document.
Et pour cette tâche, nous avons choisi d’utiliser mongo repository event listener car nous ne
souhaitons pas modifier la fonctionnalité de sauvegarde, nous voulons plutôt ajouter une
fonctionnalité.
o Un critère doit être ajouté à toutes les méthodes de récupération, les empêchant de
sélectionner des instantanés.
Récupérer un snapshot :
Pour récupérer des snapshot, nous avons ajouté des fonctions personnalisées dans le mongo
repository qui permettent de récupérer des snapshot à une date et une heure spécifiques.
Filtre avancé :
Après avoir étudié plusieurs systèmes ERP, nous avons réalisé l’importance de disposer d’une
fonctionnalité de filtrage avancée dans notre système. Ce dernier doit être adaptable à tout
filtrage compliqué avec plusieurs conditions et le développeur peut ajouter d'autres critères sans
modifier le code.
Pour atteindre cette flexibilité, nous avons créé deux types de critères, un critère logique et un
critère conditionnel.
70
Implémentation des diverses fonctionnalités communes
Tous les critères sont annotés par @Creteria annotation pour identifier les classes de critères et
leur attribuer un ou plusieurs caractères d'identification.
Ensuite, un désérialiseur a été créé pour analyser le JSON et créer le critère final pour l’injecter
dans une requête et obtenir le résultat souhaité.
Le critère de la recherche peut-être présenter par une expression logique ou conditionnelle. Une
expression conditionnelle est composée du nom du champ, un opérateur et une valeur. Une
expression logique est composée d’un opérateur et des listes de critères.
Prenons l’exemple suivant : nous avons une entité produit qui a parmi ses attributs prix,
catégorie et libellé. Si nous voulons chercher les produits qui sont de la catégorie informatique
et qui ont un prix inférieur à 250 ou qui ont un libellé contient « HP ».
L’expression est alors : (catégorie LIKE informatique) ET (prix < 250 OU (libellé CONTAINS
‘hp’)). La figure 41 illustre la structure du JSON.
71
Implémentation des diverses fonctionnalités communes
Conclusion
Au cours de ce chapitre, nous avons expliqué l’implémentation du gestionnaire d’identité
keycloak et la mise en place de l’annotation MSRef ansi que l’implémentation des gestions des
snapshots et des évènements. Dans le chapitre suivant nous allons implémenter une chaine
d’intégration continu sur GitLab.
72
Chapitre 5
73
Gestion d’intégration continue sur Gitlab(devops)
Introduction
Ce chapitre présente le cinquième sprint, où nous expliquons les différentes étapes pour la mise
en place d’un pipeline CI/CD pour la gestion d’intégration continue sur GitLab.
ID Tâche Estimation
17 En tant que développeur, je veux mettre en place l’intégration 9 jours
continue
18 En tant que développeur , je veux mettre en place le pipeline
19 En tant que développeur , je veux automatiser les test
20 En tant que développeur , je veux automatiser le déploiement
21 En tant que développeur , je veux préparer les conteneur docker
2 Devops
74
Gestion d’intégration continue sur Gitlab(devops)
DevOps est une approche de développement logiciel qui implique un développement continu,
des tests continus, une intégration continue, un déploiement continu et une surveillance
continue du logiciel tout au long de son cycle de développement. C’est le processus adopté par
toutes les grandes entreprises pour développer des logiciels de haute qualité et des cycles de
développement plus courts, ce qui entraîne une plus grande satisfaction de la clientèle, ce que
chaque entreprise souhaite.
3 Démonstration logique
Le pipeline ci-dessus présenter par la figure 43 est une démonstration logique de la façon dont
le logiciel évoluera au cours des différentes étapes de ce cycle de vie avant sa livraison au client
ou avant sa mise en production.
75
Gestion d’intégration continue sur Gitlab(devops)
Notre projet est développé en Java qui doit être compilé avant son exécution. À travers la phase
de contrôle de version, il passe à nouveau à la phase de construction, où il est compilé. Nous
obtenons toutes les fonctionnalités de ce code à partir de différentes branches du référentiel, qui
les fusionnent et utilisent finalement un compilateur pour le compiler. Tout ce processus
s’appelle phase de Build.
Ecrire des tests unitaires est une étape essentielle du processus de test dans le pipeline CI / CD.
Cependant, l’engagement est plus que la rédaction de tests. Les tests écrits doivent être fiables.
Pour qu’un test soit fiable, les résultats des tests doivent être mesurables. Les deux mesures
généralement utilisées pour les tests unitaires sont 100% de réussite et de couverture de code.
3.4 Déploiement
Une fois le test est terminé, nous passons à la phase de déploiement, dans laquelle nous
déployons l’application sur un serveur intermédiaire ou de test.
Une fois que le code est déployé avec succès, nous pouvons exécuter un autre test de santé. Si
tout est accepté, il peut être déployé en production.
76
Gestion d’intégration continue sur Gitlab(devops)
Pendant ce temps, à chaque étape, s’il y a une erreur, nous pouvons tirer un e-mail à l’équipe
de développement afin qu’ils puissent réparer le code.
Comme le montre la figure 44, les conteneurs Docker [9] encapsulent un logiciel dans un
système de fichier complet qui contient tout ce dont ils ont besoin pour fonctionner (code,
machine virtuelle, exécutable, outils système, bibliothèques...) Tout ce qu’on peut installer sur
un serveur. Cela garantit que l’exécution sera toujours identique, quel que soit l’environnement
dans lequel le conteneur sera déployé.
Docker est un outil pour les administrateurs systèmes et les développeurs. Il fournit une couche
d’abstraction et d’automatisation au-dessus de fonctionnalités de virtualisation du noyau linux.
Il s’appuie notamment sur :
Les control groups (CGROUPs), qui permettent de limiter les ressources allouées à un
processus (RAM, CPU, réseau, I/O..).
Les name spaces, qui isolent les applications les unes des autres, comme si elles étaient
seules dans l’OS.
77
Gestion d’intégration continue sur Gitlab(devops)
Docker repose sur une architecture client-serveur. Le client Docker effectue des requêtes HTTP
au service. Le service est en charge de construire, lancer et distribuer les conteneurs. Pour
construire les conteneurs il s’appuie sur des images stockées sur des dépôts publics et/ou privés.
Le client peut invoquer un service local ou distant via, une API REST. Nous avons choisi
d’utiliser les conteneurs de déploiement Docker pour les intérêts et avantages qu’ils offrent.
Le tableau 13 résume ces intérêts et avantages.
Tableau 13. Les intérêts et les avantages de docker
Intérêts/avantages Explication
Portabilité On peut créer un container et le faire
fonctionner sur n'importe quelle machine ou
service qui supporte Docker. Il y a deux
limitations à cette portabilité :
- Il faut que l'architecture cible soit
compatible.
- Le noyau linux étant celui de l'hôte, le
container ne peut pas exécuter une
image qui exigerait un noyau plus
récent.
Démarrage rapide un conteneur Docker démarre presque
instantanément
Ressources limitées Les conteneurs docker ne sont pas
gourmands en ressource. Ils sont ultra légers.
Isolation chaque conteneur a l'impression de disposer
d'une machine entière pour lui seul.
Déploiement simple Docker est une solution qui permet de
standardiser la façon dont une application est
packagée, puis s’exécute, dans n’importe
quel environnement. Ce qui simplifie et
accélère le déploiement.
Déploiement simple Docker bénéficie d'une communauté très
dynamique. Il existe donc une bonne
78
Gestion d’intégration continue sur Gitlab(devops)
A chaque micro-service développé et testé nous préparons un docker file qui permet la
préparation de l’image et l’exécution de conteneur de ce service. Il est indispensable de pouvoir
lier des conteneurs. Pour pouvoir lier deux conteneurs, il faut imposer leur nom, à l’aide de
l’option « name », et lancer le second conteneur avec l’option « link » dont la valeur fait
référence au nom du premier conteneur. Docker va alors fournir au conteneur du serveur web
les infos lui permettant de communiquer avec la base de données. Pour notre application en micro-
services nous avons utilisé Docker compose pour pouvoir démarrer et arrêter plusieurs conteneurs
simultanément tout en définissant les liens entre eux. Pour démarrer la totalité de l’application
d’un seul coup avec docker compose nous suivons ces étapes :
Décrire l’environnement de chacun des services de l’application à l’aide d’un dockerfile.
Créer un fichier [Link] pour définir les services qui composent
l’application, et compléter/surcharger certaines des propriétés définies dans leurs
dockerfiles.
Définir également les liens entre les services.
Pour chaque service on donne un lien vers le dossier dans lequel se trouve son dockerfile,
ou l’URL du dépôt Git dans lequel il est stocké.
Lancer toute l’application avec docker-compose up.
5 Démonstration physique
79
Gestion d’intégration continue sur Gitlab(devops)
La livraison continue permet aux organisations de fournir des logiciels à moindre risque. Le
chemin vers la livraison continue commence par la modélisation du pipeline de livraison de
logiciels utilisés au sein de l’organisation et se concentre ensuite sur l’automatisation de tout
cela. La rétroaction directe précoce, activée par l’automatisation des pipelines, permet une
livraison plus rapide des logiciels par rapport aux méthodes de livraison traditionnelles. Par
conséquent, nous allons présenter un aperçu de chacune des étapes décrites dans la figure 46
ci- dessous.
80
Gestion d’intégration continue sur Gitlab(devops)
Checkstyle est un outil de développement open source destiné à aider les programmeurs à écrire
du code Java conforme à une norme de codage. Il automatise le processus de vérification du
code Java par un rapport à un ensemble de règles configurable. Cette tâche est importante pour
les projets qui souhaitent appliquer une norme de codage.
81
Gestion d’intégration continue sur Gitlab(devops)
Les tests sont sous la responsabilité de l’équipe Qualité (assurance de la qualité). En pratique,
les tests continus constituent la partie la plus difficile d’un pipeline de livraison continue. En
va montrer ce que cela signifie et ses avantages :
- Les tests continus consistent à rédiger des tests et à les exécuter de manière automatisée
- Pipeline CI / CD. Cette stratégie permet de tester plus rapidement, plus tôt et souvent
de manière totalement transparente.
- Augmenter la confiance dans le code avant la production.
- Garanti la qualité tout au long du pipeline
- Produire une version candidate du logiciel à chaque changement de code
- Réduire les coûts de développement et de maintenance.
Afin de garantir l’intégrité du code et de valider les plus petites unités du logiciel, nous avons
créé une étape qui exécute les tests JUnit réalisés par les développeurs. Nous utilisons Gradle
pour exécuter ces tests présentés par la figure 48.
82
Gestion d’intégration continue sur Gitlab(devops)
Dans ce stage, on va créer un fichier exécutable. Ce fichier contiendra toutes les librairies
nécessaires au bon fonctionnement de l’application.
L’étape de construire une image docker consiste d’ajouter chaque fichier JAR de micro-service
dans un fichier Docker qui va être rendu sur une image Docker. Les étapes de la création d’une
application java exécutable avec Docker sont les suivants:
Construire une image basée sur Java Runtime Environment.
Ajoutez le fichier JAR à l’image Docker.
Exécutez le fichier JAR avec la ligne de commande.
Vérifiez l’état de santé de l’application.
Exposer le port de l’application.
Après avoir créé un fichier Docker pour chaque service d’application, nous devons créer les
images et les pousser dans notre registre GitLab, qui est un gestionnaire d’images de docker,
qui permet de stocker les images. La figure ci-dessous, illustre l’images docker qui existe dans
notre registre.
Figure 49. Publication d’une image docker eureka-server dans le registry de GitLab
83
Gestion d’intégration continue sur Gitlab(devops)
Conclusion
Au cours de ce chapitre, nous avons décrit les étapes du cycle de vie du pipeline CI/CD et la
planification de l’environnement automatisé.
84
Conclusion générale
Ce travail s’inscrit dans le cadre de projet de fin d’études. Il a été réalisé au sein de la société
ASM (all soft multimédia) et consiste à la mise en place d’un socle Java JEE/angular. Il présente
un outil de démarrage de chaque projet ainsi que le démarche devops.
Nous avons conçu et développé un socle en utilisons l’architecture en micro-services. Nous
utilisons pour accomplir cette mission des projets spring cloud ainsi que d’autre projet spring.
Pour ce projet, nous étions responsables de la mise en place de l’architecture de la solution ainsi
que la conception, la réalisation, les tests et le déploiement. Nous avons pu résoudre à travers
cette migration les limites exigées par le style architectural monolithique sur les grands projets.
Grâce à cette expérience, nous avons pu, d’une part, découvrir de nouvelles technologies et
d’autre part acquérir de nouvelles compétences. Par ailleurs, ce projet nous a aussi été bénéfique
de point de vue personnel puisqu’il nous a permis d’appréhender le travail au sein d’une grande
société et dans une hiérarchie professionnelle. Le travail de groupe, la gestion de projet de façon
méthodique et la répartition des tâches et des efforts sont tous des compétences que nous avons
acquis grâce à ce stage.
Bien que les principaux objectifs de notre projet soient atteints, l’application pourrait être
enrichie davantage par d’autres fonctionnalités.
Pour conclure, nous pensons que cette période de stage au sein de la société ASM a été une
expérience professionnelle enrichissante pour notre carrière.
85
Bibliographie
86
MINISTERE DE L’ENSEIGNEMENT SUPERIEUR ET DE LA RECHERCHE SCIENTIFIQUE
UNIVERSITE NORD-AMERICAINE PRIVEE
INSTITUT INTERNATIONAL DE TECHNOLOGIE
ABSTRACT:
THIS PROJECT HAS BEEN CARRIED OUT AS PART OF THE END-OF-STUDY PROJECT FOR THE
OBTAINING OF THE NATIONAL DEGREE OF SOFTWARE ENGINEERING ENGINEER IN
SOFTWARE AND COMPUTER SOFTWARE THAT HAS TAKEN PLACE WITHIN THE COMPANY
ASM.
THE PURPOSE OF OUR PROJECT CALLED PREPERATION OF A MICRO-SERVICES
ARCHITECTURE FOR THE DEVELOPMENT OF A SAAS ERP IS TO SET UP A MICROSERVICES
ARCHITECTURE TO DEVELOP AN ERP, IN ADDITION TO SEVERAL OTHER FUNCTIONALITIES,
WHICH AIM TO MINIMIZE THE TECHNICAL ROLE OF THE DEVELOPER TO CONCENTRATE
ONLY TO THE BUSINESS.
87
88
L'architecture micro-services offre plusieurs avantages comparée aux architectures monolithiques et modulaires. Contrairement aux systèmes monolithiques qui nécessitent le redéploiement complet pour chaque changement, les micro-services permettent des mises à jour plus simples et isolées. Cette architecture utilise divers langages pour optimiser chaque service, par opposition à la limitation d'une seule langue dans les systèmes monolithiques . L'isolement des services dans une architecture micro-services facilite la détection et le remplacement des services défectueux, sans perturber l'ensemble du système .
L'utilisation de l'annotation MSRef permet la référence de documents entre différents micro-services, facilitant ainsi l'interaction et l'harmonisation des données de manière décentralisée. Cela accroît la flexibilité des services et permet d'intégrer facilement des données provenant de diverses sources tout en respectant la logique métier .
L'API Gateway joue un rôle central dans la gestion des micro-services en servant de point d'entrée unique pour les requêtes des clients, ce qui cache la complexité et le partitionnement des services backend. Il achemine les requêtes vers le micro-service approprié et assure une communication transparente entre le front-end et les services. Cela permet de modifier ou de déployer des micro-services sans que l'utilisateur ne soit impacté par des changements d'emplacements .
Les caractéristiques clés des micro-services qui assurent leur efficacité incluent leur décomposition en unités fonctionnelles autonomes, chaque service gérant une fonctionnalité spécifique. Cela permet d'augmenter les ressources lorsque nécessaire pour un service particulier sans affecter les autres services. Cette indépendance permet également de tester et de déployer chaque service séparément, optimisant ainsi les mises à jour et la réponse aux demandes critiques .
Dans une application Angular de micro-services, le chargement paresseux est implémenté en chargeant uniquement les modules requis - ceux liés à la route actuelle - seulement lorsque l'utilisateur y accède. Cela améliore le temps de chargement initial de l'application, car les modules non nécessaires ne sont pas téléchargés immédiatement, réduisant ainsi l'utilisation de la mémoire et la charge sur le serveur .
La découverte de services, telle qu'Eureka, est essentielle dans une architecture micro-services car elle automatise la localisation et l'enregistrement des services deployés. Cela facilite la découverte dynamique et la gestion des services qui peuvent être créés ou supprimés fréquemment. En centralisant cette information, Eureka permet aux services de communiquer entre eux de manière fiable, même dans des environnements cloud complexes .
Les snapshots permettent de sauvegarder l'état d'un document avant sa modification, ce qui facilite la gestion des versions et la restauration des données en cas d'erreur. Dans un système utilisant Spring Boot et MongoDB, ils offrent une traçabilité et un historique des actions sur le document, aidant les administrateurs à suivre les modifications et à gérer efficacement la cohérence des données .
Le CoreModule dans Angular contient des services et des composants réutilisables qui sont partagés à travers l'application. Cela réduit la duplication de code et améliore la structure du projet. Cependant, pour maintenir des performances optimales, il est essentiel de s'assurer qu'il ne soit chargé qu'une seule fois, évitant ainsi des problèmes de performance liés aux services multiples .
La transition d'une architecture monolithique à une architecture micro-services peut poser des défis importants, notamment la recomposition des services en unités fonctionnelles indépendantes, la gestion de la complexité additionnelle due à la décentralisation des données, et l'implémentation de nouveaux outils et infrastructures pour le déploiement indépendant des services. De plus, le changement de modèle de développement et l'adoption de nouveaux standards technologiques exige une formation approfondie des équipes .
La gestion d'un backlog structuré en développement agile permet de prioriser les tâches selon leur importance et complexité, assurant ainsi que les aspects les plus critiques ou d'origine de valeur ajoutée, soient abordés en premier. Cela encourage une communication claire et transparente entre les équipes, résolvant les obstacles rapidement et assurant une allocation efficace des ressources sur les tâches essentielles et atteignable .