Zum Hauptinhalt springen

Microservices mit Quarkus

Die fachliche Logik ist auf spezialisierte Microservices aufgeteilt, die jeweils mit Quarkus implementiert sind. Quarkus bietet kurze Startup-Zeiten, geringen Speicherbedarf und eine moderne, auf CDI und MicroProfile basierende Entwicklungserfahrung. Wie die Services in die Gesamtarchitektur eingebettet sind, ist auf der Systemarchitektur-Seite beschrieben.

Neuen Service anlegen

Neue Services werden über code.quarkus.io initialisiert. Dort lassen sich Extensions auswählen und ein fertiges Maven-Projekt herunterladen. Das Projekt landet anschließend als eigener Unterordner im Monorepo.

Extensions

Ein klassischer Service im Projekt braucht die folgenden fünf Extensions:

Quarkus Extensions Auswahl

ExtensionArtifact IDZweck
Hibernate ORM with Panachequarkus-hibernate-orm-panacheDatenbankzugriff mit Active Record oder Repository Pattern
REST Jacksonquarkus-rest-jacksonREST-Endpunkte mit JSON-Serialisierung via Jackson
SmallRye Healthquarkus-smallrye-healthHealth-Checks (/q/health) für Liveness und Readiness
JDBC Driver - PostgreSQLquarkus-jdbc-postgresqlPostgreSQL-Datenbankverbindung via JDBC
OpenID Connectquarkus-oidcToken-Validierung und Authentifizierung via Keycloak

Warum diese Kombination?

  • Hibernate + PostgreSQL bilden den Persistenz-Stack. Panache reduziert Boilerplate beim Datenbankzugriff deutlich.
  • REST Jackson stellt die REST-API bereit und serialisiert Java-Objekte automatisch als JSON.
  • SmallRye Health ermöglicht Portainer und dem NGINX Proxy Manager zu prüfen, ob der Service läuft.
  • OpenID Connect bindet Keycloak an: Eingehende Bearer-Tokens werden automatisch validiert, ohne dass dafür eigener Code nötig ist.

Konfiguration

Die wichtigsten Einstellungen in src/main/resources/application.properties:

# Datenbankverbindung
quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=${DB_USER}
quarkus.datasource.password=${DB_PASSWORD}
quarkus.datasource.jdbc.url=jdbc:postgresql://${DB_HOST}:5432/${DB_NAME}

# Schema automatisch aktualisieren (nur Entwicklung)
quarkus.hibernate-orm.database.generation=update

# Keycloak
quarkus.oidc.auth-server-url=${KEYCLOAK_URL}/realms/${KEYCLOAK_REALM}
quarkus.oidc.client-id=${KEYCLOAK_CLIENT_ID}
quarkus.oidc.application-type=service

Sensible Werte wie Passwörter und URLs werden als Umgebungsvariablen übergeben und nicht in die Codebasis eingecheckt.

Datenbankschema und Migrationen

Solange es möglich ist, wird auf Flyway-Migrationen verzichtet. Stattdessen übernimmt Hibernate mit database.generation=update das Anpassen des Schemas automatisch. Das reduziert den Verwaltungsaufwand erheblich und reicht für den frühen Projektzeitraum aus, solange keine inkompatiblen Schemaänderungen nötig sind.

warnung

database.generation=update eignet sich nicht für Produktivsysteme mit wertvollen Daten. Sobald Spalten umbenannt, Typen geändert oder Daten migriert werden müssen, ist Flyway der richtige Weg.

Versionierung und Deployment

Jeder Service wird eigenständig versioniert nach Semantic Versioning. Ein Git-Tag mit v-Präfix löst die CI/CD-Pipeline aus, die ein Docker-Image baut und in die GitHub Container Registry veröffentlicht. Wie das Image dann auf dem Server landet, beschreibt die Deployment-Seite.