Projet Système Distribué Kookaburra edition 2425

Kookaburra Coding

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.

  1. 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]

  2. 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]

  3. 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]

  4. 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]

  5. 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.

  1. Créez un autre composant Spring WeatherDatapermettant 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.

  1. Vous ferez également des tests unitaires pour vérifier que vos composants fonctionnent correctement. [TESTPERSISTENCE]

  2. 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.

  1. Créez une classe WeatherService qui contient une méthode getWeather(String city) qui retourne un objet Weather contenant les informations météorologiques de la ville passée en paramètre. Vous pouvez utiliser la librairie Gson pour parser le JSON retourné par l'API. [SERVICE]. Cette classe utilisera les composants de la partie précédente WeatherComponentet WeatherData.
  2. 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]
  3. Ajoutez une méthode qui permet de retrouver les coordonnées géographiques d'une adresse. [SERVICE2]
  4. Ajoutez une méthode qui permet de retrouver la météo à une adresse. [SERVICE3]
  5. 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]
  6. 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]
    1. 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

  1. 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 au WeatherService et au VilleDeLorraineService. Vous identifierez les différents endpoints de votre API. [REST]

  2. 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

  1. 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
  2. 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.