Dans le cadre de notre formation M2 MIAGE, nous avons eu pour projet de créer une API de gestion de conférences.
Ce projet est composée de 2 services :
- un service d'une banque qui permet de gérer les paiements,
- un service de gestion des conférences.
Voici les users-stories qui ont été définies :
- En tant qu'utilisateur, je veux pouvoir m'inscrire afin d'être reconnu par le système.
- En tant qu'utilisateur, je veux pouvoir faire une recherche de toutes ses sessions de la conférence, afin de pouvoir choisir la ou les sessions qui m'intéressent.
- En tant qu'utilisateur, je veux pouvoir faire une recherche en séléctionnant une session, afin de savoir s'il reste de la place.
- En tant qu'utilisateur, je veux sélectionner, à l'issue de ma recherche, une session afin de pouvoir m'inscrire.
- En tant qu'utilisateur, je veux réserver la session et payer.
Pour mener à bien ce projet, nous devons créer une API RESTful (HATEOAS) qui permettra de gérer les conférences.
Tout d'abord, voici l'architecture de notre projet :
Il a été demandé que notre projet doit être composé d'au moins 2 services, l'un pour l'API principale et l'autre pour la banque.
Pour ce faire, nous avons mit en place des conteuneurs Docker pour pouvoir lancer et configurer nos services facilement. Aussi, nous avons mit en place un environnement d'intégration continue avec GitHub Actions pour pouvoir tester notre projet à chaque merge request. Enfin, nous avons régulièrement passé le projet sous SonarQube pour vérifier la qualité du code.
Pour simuler les actions de l'utilisateur sur notre API, nous avons mis en place Postman qui nous permet de faire des requêtes HTTP sur l'API.
En ce qui concerne l'architecture interne de notre API principale, elle se décompose en 5 services :
- KeycloakService : pour configurer Keycloak et gérer les utilisateurs,
- ConferenceService : pour gérer les conférences,
- SessionService : pour gérer les sessions,
- ReservationService : pour gérer les réservations,
- BankService : pour gérer les paiements.
Pour les routes, nous avons décidé d'empiler les ressources afin de pouvoir faire des requêtes plus précises et sécurisées comme ci-dessous :
Il est possible de lire la documentation de l'API en local en se rendant sur l'adresse suivante : http://localhost:3000/v2/api-docs une fois que le projet est lancé.
Pour que notre API soit RESTful, nous avons mis en place le principe de HATEOAS (Hypermedia as the Engine of Application State).
Le schema ci-dessous représente un exemple d'actions sucessives que peut faire un utilisateur sur notre API :
Une fois que notre utilisateur a réserver une session, il peut soit payer ou annuler sa réservation.
Ce principe est également appliqué sur les sessions qui renvoient vers la création d'une réservation mais également au niveau de la banque au moment de la création d'un compte pour le ravitailler.
Nous avons utilisé le langage de programmation Java avec le framework Spring pour concevoir le coeur de notre application.
Pour gérer la documentation de l'API, nous avons utilisé Swagger.
Pour gérer l'authentification, nous avons utilisé Keycloak.
Pour gérer les bases de données, nous avons utilisé PostgreSQL (API Conférences) et h2 (API Banque).
Pour gérer l'intégration continue, la qualité du code et la dockerisation, nous avons utilisé GitHub Actions, SonarQube et Docker.
Pour gérer les tests, nous avons utilisé JUnit et Mockito.
Pour gérer le monitoring, nous avons utilisé Grafana et Prometheus.
Voici les instructions pour pouvoir lancer notre projet en local. Attention, le projet est composé de sous-modules git, pensez à vérifier que vous avez l'entièreté du projet en local.
- Docker
- Docker-compose
-
Cloner le repo
git clone --recurse-submodules [email protected]:Benv547/m2-conference.git
-
Lancer le projet
docker-compose up
- Docker (ou Keycloak et PostgreSQL)
- Java 17
- Maven
-
Cloner le repo
git clone --recurse-submodules [email protected]:Benv547/m2-conference.git
-
Lancer Keycloak
Pour facilité la configuration de Keycloak, nous avons mis en place un fichier .json qui permet de créer un realm, ses roles et un client qu'il vous suffit d'importer dans Keycloak.
-
Lancer PostgreSQL
Votre base de données doit être nommée conference et votre utilisateur postgres doit avoir le mot de passe postgres. Il est possible de modifier ces paramètres dans le fichier application.properties du module principal.
-
Installer les dépendances pour chaque sous-module
mvn install
-
Lancer chaque sous-module
mvn spring-boot:run
Il est possible d'ajouter une instance de Graphana et Prometheus pour pouvoir visualiser les métriques de nos services.
Nous avons mis en place un Postman qui permet de faire des requêtes HTTP sur notre API, un fichier .json est disponible dans le dossier /postman.
Pour visualiser les métriques de nos services, vous pouvez lancer Graphana sur le port 3002 et obtenir les données de Prometheus sur le port 9090.