====== LU07.A01 - Discovery Service erstellen ======
Erstelle einen einfachen Discovery Service auf Basis von Sockets.
Die Programmvorlage basiert auf dem Code von [[https://realpython.com/python-sockets/]].
**[[https://classroom.github.com/a/FyhZifkw|GitHub Classroom Assignment]]**
===== Ausgangslage =====
Der Discovery-Service ist ein Python-Skript, welches die Services in unserem verteilten System verwaltet.
Die Kommunikation mit diesem Service erfolgt über Sockets.
Das Python-Skript verwaltet die Services in der Klasse ''Services''.
Diese Klasse enthält eine Liste von Dictionaries.
Für jeden Service wird ein Eintrag in der Liste erstellt.
^ Key ^ Value ^ Datentyp |
| uuid | UUID des Services | String |
| type | Die Art des Services | String |
| ip | Unter welcher IP-Adresse ist der Service erreichbar | String |
| port | Unter welchem Port ist der Service erreichbar | int |
| heartbeat | Zeitpunkt des letzten Herzschlags | datetime |
==== Aktionen ====
=== register ===
Jeder Service muss sich beim Starten beim Discovery Service registrieren.
Der Discovery-Service erzeugt eine neue UUID für diesen Service und trägt den Service in seine Serviceliste ein.
Als ''heartbeat'' wird der aktuelle Zeitstempel eingetragen.
* Argumente:
* ''type'': Die Art des Service
* ''ip'': Unter welcher IP-Adresse ist der Service erreichbar
* ''port'': Unter welchem Port ist der Service erreichbar
* Response:
* Die UUID des Services.
* ''ERROR'': Der Service konnte nicht registriert werden.
=== heartbeat ===
Jeder Service muss sich in regelmässigen Abständen (z.B. 5 Sekunden) beim Discovery Service melden.
Mit dieser Aktion wird das Attribut ''heartbeat'' der bestehenden Registration aktualisiert.
* Argumente:
* service_uuid: String
* Response:
* ''OK'': Aktualisierung war erfolgreich
* ''NOT FOUND'': Die ''service_uuid'' wurde nicht gefunden, der Service muss sich neu registrieren.
* ''ERROR'': Es ist ein Fehler aufgetreten.
=== query ===
Ein Client kann eine Liste aller Services für einen bestimmte Art von Service (''type'') anfordern.
Der Discovery-Service durchsucht seine Serviceliste nach Services mit dem gewünschten ''type''.
Entspricht ein Service der gewünschten Art **UND** der letzte Herzschlag ist weniger als 5 Sekunden alt, so wird dieser Service in die Response aufgenommen.
Jeder Service dessen letzter Herzschlag älter als 5 Sekunden ist, wird aus der Serviceliste entfernt.
* Argumente:
* ''type'': Die Art der gesuchten Services
* Response:
* Eine Liste mit der IP-Adresse und dem Port pro Service.
===== Testen =====
Um den Discovery-Service zu testen, steht dir im Repository ein einfacher Socket-Client.
- Starte deinen Discovery-Service in PyCharm oder über die Kommandozeile.
- Öffne ein separates Terminal und navigiere zum Ordner mit dem Socket-Client.
- Starte den Client mit ''py socket_client.py ''.
----
{{tag>M321-LU07}}
[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] Marcel Suter