Ce travail a été réalisé par Ivan Rigo dans le cadre du cours de système distribué de l'année 2022-23
Faire un programme en GO appliquant Gnutella utilisant REST
Le but de ce travail était d'implémenter un des algorithmes vue en cours parmis une liste. Il fallait réalise l'implémentation
avec soit go ou python, et utilise REST ou les sockets pour assurer la communication entre les noeuds. Dans notre cas,la consigne
était d'implémenter Gnutella en GO, en communiquant avec un REST que nous avons mis en place.
Chaque noeud aura un directory qu'il lira au début du programme
## Information
### Ressource
Dans le programme, ils correspond au nom des fichiers contenue dans un directory propre au noeud qu'il lira lors de l'exécution, voici l'arborescence des entrepôts dans le projet
- Storage1/
- Garbage.py
- Storage2/
- Can.txt
- Garbage.py
- Storage3/
- Ham.tyt
- Important.txt
- Storage4/
- Can.txt
- Ham.txt
- Test.html
- Storage5/
- Garbage.py
- Test.html
- Storage6/
- Can.txt
- Important.txt
- Storage7/
- Ham.txt
- Important.txt
### Transmitter
Pour chaque noeud, il correspond au premier noeud l'ayant contacté. Le noeud ayant été appelé par initReq aura -1 comme transmitter
### NodePort
Nodeport correspond à 8080 + idNoeud, donc pour envoyé une requête au premier noeud, il faudra mettre 8081
### Network
Le travail réutilise la structure du slide 104 du cours, voir schemadeNode.png pour plus de clarification sur quel node possède quel id
## Route
### Côtée client
#### Initialise la recherche (GET)
http://localhost:NodePort/initReq/ttl/ressource
Active un noeud pour démarré la recherche d'une ressource
##### ttl
Représente le nombre de saut que la requête effectuera avant que les noeud arrête de la propager
##### ressource
Représente la ressource cherché, dans notre programme,c'est le nom d'un fichier
Ci-dessous une liste représentant les fichiers et leurs
##### Retour
La requête n'affichera rien sur le terminal l'ayant envoyé, cependant, le noeud ayant reçu cet appel va affiché
s'il possède la ressource sur son terminal. Il envoit ensuite une requête req contenant le ttl,la ressource et l'id du message
### Côté noeud
Ces fonctions sont utilisé entre les noeuds et ne doivent pas être appelé par l'user
Correspond à l'id du noeud ayant envoyé la requête
##### ttl
Correspond au Time To Live, il est décremente avant de l'envoyé aux voisins autre que transmitter
##### msgId
Correspond à l'id de la recherche. Elle change à chaque fois que la route initReq est appelé
##### ressource
Représente la ressource cherché
##### Retour
Renvoie OK si tout se passe bien. La requête n'est traité qu'une fois et tout appel successive avec le même msgID renvoie OK sans exécuter le reste de la requête. Vérifie lors de la première requête s'il possède la ressource et l'envoie à son transmitter. Broadcast ensuite la requête avec un TTL décrémenté à ses voisins ormis transmitter
Correspond à l'id du noeud ayant l'objet dans son entrepôt
##### ressource
Représente la ressource cherché
#### Retour
Renvoie cette requête à son transmitter si le noeud actuel n'est pas le noeud ayant été appelé par initReq, sinon, affiche dans le terminal l'id du noeud possèdant la ressource
## Tester le programme
Pour tester le programme, démarré chaque noeud avec un terminal ouvert dans le dossier web-service-gin.
Pour chaque noeud, exécuté la commande : go run Gnutella.go neighbour-x.yaml, x étant l'id du noeud (entre 1 à 7)
Ouvrir un autre terminal et appelé la requête initReq ( http://localhost:NodePort/initReq/ttl/ressource)