In dieser Aufgabe vollziehen Sie den Schritt von einer monolithischen
Anwendung zu einer verteilten Microservice-Architektur. Am Beispiel des
Bugtrackers TrackZilla untersuchen Sie, wie bestehende
Fachdomänen geschnitten werden, wie Spring Data REST
(@RepositoryRestResource) Standard-Endpunkte bereitstellt
und welche Hürden entstehen, wenn Entitäten über Servicegrenzen hinweg
verknüpft sind.
Alle benötigten Dateien finden Sie im Aufgabenordner:
bugtracker25-vorgabe.zipbugtracker25-Ticket.zipbugtracker25-loesung.zip11.1_MicroServices-SpringDataRest.postman_collection.jsonTrackZilla verwaltet Fehlerberichte und Aufgaben für Softwareanwendungen. Das System gliedert sich in drei Kernbereiche:
Im Monolithen liegen alle Tabellen in einer einzigen relationalen Datenbank und sind über Fremdschlüssel verknüpft. In der Microservice-Variante erhält jede Domäne einen eigenen Service und eine eigene Datenhaltung.
| Service | Port | Verantwortung |
|---|---|---|
| ApplicationCatalog | 8081 |
Verwaltung von Applikationen und Metadaten |
| TicketManagement | 8082 |
Verwaltung von Tickets, Status und Zuweisungen |
| UserManagement | 8083 |
Verwaltung von Personen, Kontaktdaten und Rollen |
bugtracker25-Ticket.zip
und öffnen Sie den Ordner in IntelliJ IDEA als Maven-Projekt.TicketManagement das Interface
TicketRepository. Beachten Sie die Annotation
@RepositoryRestResource. Für normale CRUD-Operationen
existiert kein eigener @RestController.Spring Data REST nimmt ein normales Repository und stellt automatisch eine Hypermedia-API (HATEOAS / HAL) bereit.
Im Monolithen startet eine einzige main()-Methode das
gesamte System. Bei Microservices besitzt jeder Service eine eigene
Starterklasse.
ApplicationCatalog: Port 8081TicketManagement: Port 8082UserManagement: Port 8083http://localhost:8081/applicationshttp://localhost:8082/ticketshttp://localhost:8083/users11.1_MicroServices-SpringDataRest.postman_collection.json
in Postman.?page=0&size=5??sort=name,asc._links in den
JSON-Antworten. Welchen Zweck erfüllen Hypermedia-Links für
API-Clients?Im Monolithen lässt sich in Java direkt
ticket.getApplication().getOwner().getName() aufrufen, da
die relationale Datenbank die Tabellen über JOINs verbindet.
Bei getrennten Services funktioniert dieser direkte Zugriff nicht mehr:
ApplicationCatalog speichert lediglich eine
owner_id, hat aber keinen Zugriff auf die Tabellen von
UserManagement.lsof -i :8081 und
beenden Sie verbleibende Java-Prozesse.path-Attribut in
@RepositoryRestResource). Kontrollieren Sie die Pfadangabe
auf dem Interface.