Servicearchitektur
In diesem Abschnitt wird beschrieben, wie ein Microservice in der Regel aufgebaut ist. Abweichungen von diesem Aufbau werden bei dem jeweiligen Service dokumentiert.

Ein Backenservice verwendet wls-common bei der Implementierung
Backendservices

Grundlegende Architektur eines Backendservices
Ein Backendservice besteht in der Regel aus 3 Layern.
access layer... Ermöglicht den Zugriff auf den Backendservice von außenservice layer... Durchführung der fachlichen Logik, wie Validierung oder Lesen und Speichern, sowie die Verwendung
dritter Services zur Erfüllung der Aufgabenpersistence layer... Zugriff auf die Datenbank
Security
Komponenten die eine rote Umrandung haben sind Teil der Security.
Authentifizierung
Es gibt eine Zugriffskontrolle im access layer. Hier wird geprüft, ob für den Zugriff auf die geforderte Ressource die erforderliche Authentifizierung gegeben ist. Bis auf wenige Ausnahmen ist für jeden Zugriff auf eine Ressource eine Authentifizierung erforderlich.
Autorisierung
Die Security im service layer und persistence layer prüft die Autorisierung. Die Ausführung der Methoden erfordert in der Regel mindestens ein der Funktion entsprechendes Recht. Das Verändern der Daten eines bestimmten Wahlbezirkes erfordert auch, dass der User berechtigt ist für diesen Wahlbezirk Daten zu verändern.
Der bezirkIDCheck wird definiert durch das Interface de.muenchen.oss.wahllokalsystem.wls.common.security.BezirkIDPermissionEvaluator und hat folgende Implementierungen:
BezirkIDPermissionEvaluatorImpl... führt eine Prüfung des Authentication-Objektes durchDummyBezirkIdPermissionEvaluatorImpl... liefert immertrue
Fehlerbehandlung
Exceptions, die während der Verarbeitung geworfen werden, werden durch den GlobalExceptionHandler verarbeitet. Dieser erzeugt ein WlsExceptionDTO und definiert den entsprechenden Http-Statuscode.
Grundlegen gilt folgendes Mapping von Subklassen einer WlsException zu dem Http-Statuscode:
| WlsExceptionDTO | Http-Statuscode |
|---|---|
| FachlicheWlsException | 400 |
| TechnischeWlsException | 500 |
| InfrastrukturelleWlsException | 500 |
| SicherheitsWlsException | 403 |
Weil das Fehlerhandling in allen Services gleich sein soll, wird es über die Bibliothek wls-common:exception bereitgestellt.
Restclients, die auf andere Services zugreifen, verwenden den WlsResponseErrorHandler um konsequent WlsExceptions zu werfen.
Accesslayer
Im Accesslayer befinden sich die Klassen, Interfaces und Records, welche den Zugriff auf den Microservice mitels REST via Http ermöglichen.

Komponenten des Accesslayers
Abhängigkeiten der Klassen des Accesslayers untereinander, sowie den Zugriff auf den Servicelayer
Je Domain gibt es ein Subpackage. In jedem Subpackage gibt es einen RestController, einen Mapper und die Records für das Datenmodell.
Beispiel Packagestruktur in Basisdatenservice
├─ rest
| ├─ common
| | ├─ WahlbezirkArtDTO
| ├─ handbuch
| | ├─ HandbuchController
| | ├─ HandbuchDTOMapper
| ├─ wahlbezirke
| | ├─ WahlbezirkDTO
| | ├─ WahlbezirkDTOMapper
| | └─ WahlbezirkeControllerWahlbezirkArtDTO wird in handbuch und wahlbezirke verwendet.
Servicelayer
Im Servicelayer befinden sich die Klassen, Interfaces und Records, die zur Umsetzung der fachlichen Anforderungen notwendig sind.

Komponenten des Servicelayers
Abhängigkeiten der Klassen des Serviceslayers untereinander, sowie den Zugriff auf den Persistencelayer
Beispiel Packagestruktur in Basisdatenservice
├─ client
| ├─ DummyClientImpl
| ├─ WahlbezirkeClientImpl
| └─ WahlbezirkeClientMapper
├─ service
| ├─ common
| | ├─ WahlbezirkArtModel
| | └─ WahltagIdUndWahlbezirksart
| ├─ wahlbezirke
| | ├─ WahlbezirkeClient
| | ├─ WahlbezirkeValidator
| | ├─ WahlbezirkeService
| | ├─ WahlbezirkModel
| | └─ WahlbezirkModelMapper
| ├─ handbuch
| | ├─ HandbuchModelMapper
| | ├─ HandbuchReferenceModel
| | ├─ HandbuchService
| | ├─ HandbuchValidator
| | └─ HandbuchWriteModelWahlbezirkArtModel wird in handbuch und wahlbezirke verwendet. client.WahlbezirkeClientImpl implementiert service.wahlbezirke.WahlbezirkeClient
Servicepackage
Der Großteil der Implementierung erfolgt im Package service. Je Domain, die durch den Microservice abgedeckt wird, gibt es ein Subpackage. Dieses beinhaltet die Serviceklasse, den Mapper, den Validator sowie die Klassen für das Datenmodell.
Die Rückgabewerte und Parameter der Methoden des Services sind Klassen des Datenmodells des Services. Im Mapper werden die Klassen des Servicedatenmodells auf die Klassen des Domaindatenmodells gemappt. Durch den Validator wird sichergestellt, dass die Parameter valide sind. Werden Daten von anderen Microservices benötigt, so wird diese Schnittstelle durch ein Interface abgebildet. Die Rückgabewerte und Parameter sind wie beim Service Klassen des Datenmodells des Services.
Clientpackage
Im Package client ist die Funktionalität für den Zugriff auf einen anderen Microservice implementiert. Der Dummyclient implementiert alle in den Subpackages definierten Interfaces, die für den Zugriff auf andere Microservices definiert sind. Er dient primär den Testzwecken und soll eine Eigenständigkeit des Services ermöglichen.
In den Subpackages von client werden die Zugriffe nach externen Microservices gebündelt. In den jeweiligen Packages gibt es eine Implementierungsklasse für den Zugriff auf den externen Microservice sowie einen Mapper. Der Mapper konvertiert das Datenmodell des externen Microservices auf das geforderte Datenmodell im Microservice.
IMPORTANT
Unter Umständen kann auf ein Datenmodell im Servierlayer verzichtet werden.
Persistencelayer
Für den Zugriff auf die Datenbank wird Spring-Data verwendet.

Komponenten des Persistencelayers
Beziehungen der Komponenten des Persistencelayers
Die Klassen und Interfaces werden im Package domain abgelegt. Analog zu den Services werden Subpackages je Domain definiert. Klassen, die durch Entitäten verschiedene Subpackages verwenden, sind in dem Subpackage common abzulegen.
Beispiel Packagestruktur in Basisdatenservice
├─ domain
| ├─ common
| | ├─ WahlbezirkArt
| | └─ WahltagIdUndWahlbezirksart
| ├─ handbuch
| | ├─ Handbuch
| | └─ HandbuchRepository
| ├─ ungueltigeWahlscheine
| | ├─ UngueltigeWahlscheine
| | └─ UngueltigeWahlscheineRepositoryWahlbezirkArt wird in handbuch und ungueltigeWahlscheine auf dieselbe Weise verwendet