Projet Système Distribué Kookaburra edition 2425
Description
L'objectif de ce projet est de vous permettre de mettre en oeuvre différents aspects de la conception et du développement d'une application distribuée. Vous allez construire une application de plus en plus complexe, en utilisant différentes technologies. Vous utiliserez toujours le même projet, mais vous allez le modifier au fur et à mesure des étapes. Chaque étape sera taggée, afin de pouvoir vérifier votre travail. Ce projet vous permettra d'acquérir différentes notions et compétences au fur et à mesure. Différentes documentations vous permettront de vous familiariser avec les technologies utilisées.
Avant de commencer
Docker Compose
Vous aurez besoin de Docker et Docker Compose pour ce projet. Vous pouvez les installer en suivant les instructions sur le site officiel de Docker. Vous pouvez également utiliser Docker Desktop pour Windows ou Mac.
Le fichier docker-copose.yml servira pour décrire la configuration du déploiement. Pour l'instant il ne contient que ce qu'il faut pour démarrer une base de données mariadb. Vous pouvez ajouter d'autres services au fur et à mesure de l'avancement du projet.
Pour démarrer les services utilisez la commande suivante:
docker-compose up
Pour arrêter les services utilisez la commande suivante:
docker-compose down
Base de données
Pour visualiser la base de données, vous pourrez utiliser une extension de VSCode comme SQLTools et le configurer avec les paramètres du fichier application.properties.
Tests
Si votre installation est bien configurée, vous devriez pouvoir lancer les tests unitaires avec la commande suivante:
mvn test
IntelliJ
Vous pouvez utiliser IntelliJ pour ce projet. Commande pour setup la JavaHome
export JAVA_HOME=/home/junper/.jdks/corretto-19
export PATH=$JAVA_HOME/bin:$PATH
Étapes
Étape 1: Appeler une API REST d'un service externe - création de composants et injection de dépendances
Nous allons utiliser OpenWeatherMap comme source d'informations météorologiques. Pour cela, vous devez créer un compte sur le site https://openweathermap.org/ et récupérer votre clé d'API. Vous pouvez utiliser la documentation de l'API pour comprendre comment l'utiliser.
-
Créez un composant qui permet de faire une requête permettant de récupérer les informations de météo d'une ville. Vous pouvez utiliser la librairie
Gson
pour parser le JSON retourné par l'API.https://openweathermap.org/current
[CALL] -
Ajoutez une méthode qui permet de retrouver les informations météorologiques d'un lieu à partir de ses coordonnées géographiques (latitude,longitude) [WEATHER]
-
Créez un autre composant qui permet de retrouver les coordonnées géographiques d'une adresse. Vous pouvez utiliser pour cela le service gouvernemental de gestion des adresses
https://api-adresse.data.gouv.fr/
[GEO] -
Créez un troisième composant qui permet de retrouver la météo à une adresse. Ce composant utilisera les deux composants précédents. [WEATHERGEO]
-
Ecrivez des tests unitaires pour vos composants. Vous pouvez utiliser JUnit ou TestNG. Vous vérifierez que votre classe retourne bien les informations météorologiques d'une adresse si elle existe et que votre classe retourne une erreur si l'adresse n'existe pas. [TESTCALL]
Étape 2: Création d'une base de données et mise en place de composants.
Pour cette partie vous vous référerez au cours sur la gestion de la persistence et sur l'injection de dépendances.
- Créez un autre composant Spring
WeatherData
permettant de rendre persistant les résultats des appels au service de météo. Vous utiliserez Spring Data JPA pour accéder à la base de données. Vous utiliserez une base de données relationnelle (MariaDB). Vous pouvez utiliser Docker pour installer et exécuter. Faites en sorte d'avoir un schéma en 3NF sur la base des données du service de météo. [PERSISTENCE]
Vous devriez avoir une table pour la ville obtenue à partir de la position géographique avec sa position, une table pour les informations météo au moment de l'appel (current), lié à une ville.
Attention, pour cette partie, il y a beaucoup de choses à faire. Je vous conseille de commencer par créer une base de données et de créer une classe qui permet de faire des requêtes simples sur la base de données. Vous pourrez ensuite créer un composant qui permet de rendre persistant les résultats de chaque appel au service de météo. Il devra être possible de récupérer un historique des températures d'un lieu particulier à partir de votre base.
-
Vous ferez également des tests unitaires pour vérifier que vos composants fonctionnent correctement. [TESTPERSISTENCE]
-
Vous ferez également un script Java qui appellera votre composant pour peupler votre base de données avec des appels réguliersau service et pour différents lieux. [SCRIPT]
Étape 3: Création d'un Service métier
On va maintenant passer à la dimension service de l'application. Vous devez transformer votre composant principal en service, toujours en utilisant Spring. Vous pouvez utiliser l'injection de dépendances pour injecter les composants nécessaires. Vous pouvez utiliser les annotations @Service
et @Autowired
pour déclarer vos services et injecter les dépendances.
- Créez une classe
WeatherService
qui contient une méthodegetWeather(String city)
qui retourne un objetWeather
contenant les informations météorologiques de la ville passée en paramètre. Vous pouvez utiliser la librairieGson
pour parser le JSON retourné par l'API. [SERVICE]. Cette classe utilisera les composants de la partie précédenteWeatherComponent
etWeatherData
. - Ajoutez une méthode qui permet de retrouver les informations météorologiques d'un lieu à partir de ses coordonnées géographiques (latitude,longitude) [SERVICE1]
- Ajoutez une méthode qui permet de retrouver les coordonnées géographiques d'une adresse. [SERVICE2]
- Ajoutez une méthode qui permet de retrouver la météo à une adresse. [SERVICE3]
- Vous pourrez retourner aussi bien la météo courante que l'histoire des températures pour une ville donnée. Vous pourrez aussi retourner la météo pour une adresse donnée. [SERVICE4]
- Vous créerez un autre service
VilleDeLorraineService
qui permet de retourner la liste des villes de Lorraine et qui permet de vérifier si une ville est en Lorraine ou pas. [SERVICE5]- La Lorraine est une ancienne région comprenant les départements 54, 55, 57 et 88. Si vous voulez considérer une autre région c'est possible.
Etape 4: Création d'une API REST
-
Créez une API REST qui permet de récupérer les informations météorologiques d'une ville de Lorraine. Vous pouvez utiliser Spring Boot pour créer votre API. Vous pouvez utiliser Swagger pour documenter votre API. Vous créerez un
WeatherController
qui fera appel auWeatherService
et auVilleDeLorraineService
. Vous identifierez les différents endpoints de votre API. [REST] -
Ecrivez des tests unitaires pour votre API. Vous serez peut être amené à utiliser des mocks pour vos tests. [RESTTEST]
Étape 4: Création d'un service d'alerte météo
- Ajoutez un service qui permet à un utilisateur de créer des alertes quand une nouvelle température est ajoutée dans la base pour une ville. Les alertes sont enregistrées dans un topic de RabbitMQ
- Créez un client qui peut s'abonner à ce topic pour recevoir les notifications concernant une ville. [RABBITMQ]
Etape 4bis: Création d'un front.
Vous allez créer un front qui permettra de récupérer les informations météorologiques d'une ville de Lorraine. Vous pouvez utiliser React ou Angular ou faire un simple front en Python en utilisant Flask. [FRONT]
Etape 5: Ajout d'un service de cache
Le service de cache permettra aux utilisateurs de récupérer les données météorologiques sans avoir à appeler l'API externe d'OpenWeatherMap. Le service de cache doit être mis à jour à chaque fois qu'une donnée est enregistrée dans la base de données. Le service de cache permettra également de contrôler le nombre de requêtes faites à l'API externe. Pour une ville donnée, on ne mettra pas à jour le cache si la dernière mise à jour date de moins de 60 minutes. Si la dernière mise à jour date de moins de 60 minutes, on retournera la valeur du cache. Si la dernière mise à jour date de plus de 60 minutes, on mettra à jour le cache et on retournera la valeur du cache.
- La limite du nombre d'appel par jour est de 1000. Si le nombre d'appel est dépassé, on retournera la valeur du cache. S'il n'y a pas de valeur dans le cache pour la ville demandée, on retournera la valeur de la ville la plus proche à vol d'oiseau à partir des coordonnées GPS qui dispose d'une valeur de température.
- Vous utiliserez Redis pour implémenter le cache.
- Vous utiliserez Spring Data Redis pour accéder à Redis. [CACHE]
Etape 6: Déploiement avec Docker-Compose
Votre application comporte plusieurs micro services (Weather, Lorraine, Alerte), une ou deux bases de données, un service de cache, un service de messagerie. Vous allez créer un fichier docker-compose.yml qui permettra de déployer votre application simplement. [DOCKER]
Etape 7: API Gateway et Authentification
Vous allez créer un API Gateway qui permettra de gérer l'authentification des utilisateurs.
- Vous utiliserez Spring Cloud Gateway.
- Vous utiliserez Spring Security pour gérer l'authentification des utilisateurs.
- Vous utiliserez Spring Cloud Config pour gérer la configuration de votre application.
- Vous utiliserez Spring Cloud Discovery pour gérer la découverte des services.
- Vous utiliserez Spring Cloud Circuit Breaker pour gérer les appels aux services. [GATEWAY]
Etape 8: Déploiement dans le Cloud
Si on a le temps.