Aufbau eines reaktiven RESTful Webdienstes mit Spring WebFlux

  • 24 Okt 2023
  • Rupert Burchardi
  • 10 min

In diesem Tutorial zeigen wir, wie leicht man Spring WebFlux mit Kotlin kombinieren kann, um einen reaktiven Web-Server zu entwickeln. Es handelt sich dabei um ein sehr einfaches Beispiel, dass nur den Einstieg aufzeigen soll und eigentlich nicht der Komplexität einer reaktiven Anwendung gerecht wird.

Wer noch nicht genau weiß, was ein reaktiver Web-Server ist, der sollte sich unser Tutorial: Reactive Programming mit Java ansehen.

Datenbank aufsetzen mit Docker Compose

In diesem Beispiel werden wir eine Postgres Datenbank nutzen. Diese können wir zum Beispiel mit Hilfe von Docker compose starten.

Die folgende Konfiguration legt eine Postgres Datenbank und startet ein Initialisierungsskript:

Das Datenbank-Skript db.sql legt uns eine Tabelle message an und füllt sie mit 1000 Testdatensätzen.

Benötigte Dependencies

Für unser kleinen reaktiven Webserver nutzen wir zwei Spring Boot Starter Bibliotheken: Spring Boot Webflux Starter für den non-blocking REST-API-WebServer und Spring Boot Starter Data R2DBC für den non-blocking Datenbank Zugriff. Um die Vorteile von Kotlin nutzen zu können, brauchen wir zwei Bibliotheken: Kotlin Reflect und Kotlin Coroutines Reactor. Damit können wir anstatt mit Mono und Flux mit Flow und suspendable Methods arbeiten.

Message model und Repository

Jetzt müssen wir noch das Message-Model anlegen. Wir realisieren das mit einer Kotlin Data Klasse, die einiges an Funktionalität mitbringt, wie z.B. equals() / hashCode() und eine toString()-Methode mit den Klassen-Attributen.

Durch @Id wird das id Feld als das Feld markiert, welches den Primary Key repräsentiert. Ist der Wert 0, weiß Spring Boot Data, dass es sich um ein neues Objekt handelt.

Zum Schluss brauchen wir noch eine Repository-Klasse um die Elemente aus der Datenbank zu holen.

Dafür nutzen wir ein CoroutineCrudRepository aus dem Spring Data Framework. Hier sind alle Methoden bereits suspendable, so dass wir die Vorteile von Kotlin nutzen können.

Rest Controller

Zum Schluss brauchen wir noch den Rest-Controller, der uns die CRUD-Operationen bereitstellt.

Die Methoden sind alle suspendable, aber mehr müssen wir nicht machen. Die gesamte Umwandlung von suspendable Method zu Mono/Flux übernimmt für uns Kotlin Coroutines Reactor und das reaktive Anbinden an den Netty Webserver übernimmt Spring Boot Webflux.

Fazit

Nie war es einfacher einen reaktiven Webserver mit Java bzw. Kotlin aufzusetzen. Allerdings handelt es sich hier aber nur um ein sehr kleines Beispiel. Bringt man mehr Komplexität in das Projekt, dann werden die Schwierigkeiten, die ein reaktives Framework mit sich bringen, erst wirklich deutlich. Wer sich dafür interessiert, sollte einfach mal dieses Projekt von Github clonen und selbst erweitern.

Falls es Fragen oder Anregungen gibt, dann schreibt uns gerne eine Mail an: info@youniverse.com.