Spring Boot Schulung Highlights und Erkenntnisse
Christian Kunzmann
6 Minuten
Eine der Schlüsseltechnologien, die wir in vielen Projekten einsetzen, ist SpringBoot. Das Framework ist darauf ausgelegt Backends schnell aufzusetzen. Dank umfangreichem Ökosystem und ausgereifter Konzepte, können viele Anforderungen mit wenig Code umgesetzt werden. Dazu können weitere benötigte Systeme, wie z.B. Datenkbanken, Message-Broker oder ElasticSearch einfach eingebunden werden.
Zur Konsolidierung und Erweiterung unseres internen und für Projekte erlangten Wissens, ging es zur “SpringBoot Advanced” Schulung nach Köln. 🚅 🌆 ⛪️
Die Rheinmetropole konnte Christian, Hans-Joachim, Janis, Peter und Jens nicht nur mit ihrer bekannten Brautradition, sondern auch mit internationaler Küche (❤ bonjour saigon) begeistern. 😊
Den Trainer Siegfried Steiner können wir mit bestem Gewissen sowohl inhaltlich als auch methodisch empfehlen und möchten ihm an dieser Stelle danken.
Durch unterschiedliches Vorwissen in manchen Spezialthemen sowie unsere kommunikative Art, konnten wir zu einem spannenden Austausch beitragen – sowohl zwischen Teilnehmer:innen als auch mit dem Trainer.
Nachfolgend wollen wir mit ausgewählten Einblicken in Themen und Takeaways einen Ausblick auf die Nützlichkeit und Relevanz von SpringBoot geben. Dabei werden die Aspekte betont, die wir für besonders wertvoll für die meisten Projekte erachten.
Actuator
Metriken automatisch Erheben und Bereitstellen!
Mit SpringBoot Actuator kann schnell eine starke Basis für Monitoring und Alerting aufgesetzt werden. Dabei wird weitgehend auf dem Standard Micrometer aufgesetzt, welches eine einfache Einbindung in andere OpenSource Tools, wie z.B. Prometheus (Zeitreihendatenbank) und Grafana (Visualisierung & Alarmierung) ermöglicht. So können DevOps-Teams ihre Anwendungen bis hoch in produktive Umgebungen gut im Blick behalten. #Monitoring #Alerting #DevOps
Bei Bedarf von Performance-Analysen kann das Logging von Ausführungszeiten via Annotation sehr hilfreich sein, vor allem beim Aufrufen von Fremdsystemen zur Klärung, wo die Zeiten bleiben.
Beim Setup oder auch übergreifend infrastrukturell sollte darauf geachtet werden, nicht aus Versehen zu viele Informationen über die Systeme nach außen zu exponieren. #Security #Information-Hiding
Configuration
Durch die Erläuterungen zu SpringBoot-Startern sowie deren Konzept und Aufbau wurde uns eines der Kernkonzepte näher gebracht. Die diversen Starter, wie z.B. spring-boot-starter-data-elasticsearch geben mit sinnvollen Standardkonfigurationen und einfacher Möglichkeit diese zu überschreiben, Zugriff auf gewünschte Funktionen.
Wenn Anforderungen spezieller werden, können Framework-Implementierungen erweitert, überschrieben oder auch aus eigenem Code aufgerufen werden.
Reactive
SpringBoot entwickelt sich strategisch weiter in die Richtung nicht-blockierender Abarbeitung, um höheren Datendurchsatz ermöglichen zu können. So sollen beispielsweise REST-Backends nicht pro Anfrage einen Thread blockieren, wenn deren Abarbeitung auf Antwort aus einer Datenbank wartet. Während wir die Intention von Reactive verstehen und begrüßen, scheinen die praktischen Einsatzszenarien aber bis dato noch selten zu sein.
REST
Zustandslose REST-APIs haben sich schon lange als führender Industriestandard für viele Kontexte etabliert. Dabei geht es neben der Implementierung von Schnittstellen auch um deren Spezifikation. Aufbauend können verschiedene Entwicklungsvarianten gewählt werden, etwa ein Code First- oder Contract First-Ansatz. Hier haben sich Tools und Spezifikationen entwickelt, welche heute sehr effiziente Hilfsmittel sein können und auch von SpringBoot unterstützt werden, v.a. OpenAPI (ehemals Swagger) und Swagger-UI.
So bietet SpringDoc mit dem Starter springdoc-openapi-webmvc-ui einen einfachen Einstiegspunkt, welcher Swagger-UI zur Veranschaulichung einbindet und dem explorativen Erkunden der API. Swagger-UI hat sich in vielen Projekten auch als gutes Mittel zur Kommunikation und Abstimmung erwiesen, weswegen wir dessen Einsatz sehr empfehlen.
Die Variante den Code zuerst zu schreiben und damit die API-Beschreibung am Code mittels Annotations zu pflegen, unterstützt die Aktualität der Dokumentation. Sie kann jedoch zu Kosten der Lesbarkeit der Implementierung führen. Um dies abzufangen, können auch Interfaces deklariert werden, welche die Dokumentation tragen und vom konkreten Code in deren Implementierung trennen. Ob dieses Muster für deinen Kontext erstrebenswert ist, kann je nach Projektgröße und -komplexität, sowie auch nach Teamkonstellation, unterschiedlich bewertet werden.
Beim Contract First Ansatz werden nicht direkt REST-Endpunkte geschrieben, sondern die Spezifikation kann auch Code generieren. Dies kann z.B. Vorteile haben, wenn eine neue Schnittstelle zwischen mehreren Teams deren Entwicklung früh deblockieren soll.
Zum Generieren kann beispielsweise ein OpenAPI Generator Maven Plugin verwendet werden, welches auf dem SpringBoot-typischen Build-Werkzeug Maven aufsetzt. Beim Einsatz von Codegenerierung sollte jedoch die Aktualität beachtet werden. Hierbei tauchen oft Herausforderungen und Fehler auf.
Zur Implementierung der RESTController wollen wir herausstellen, dass die typische Annotation-basierte Steuerung des Frameworks sich als sehr effizient und angenehm in der Entwicklung darstellt. Weiterführende Themen, wie HATEOAS oder ein Reifegradmodel, sind empfehlenswert, aber werden hier nicht weiter vertieft.
Data
Das SpringBoot Ökosystem umfasst Unterstützung für viele verschiedene Datenbanken, sowohl relationale als auch NOSQL-Datenbanken in diversen Ausprägungen sowie auch Suchmaschinen wie z.B. Elasticsearch.
Spring-Data bietet dabei eine Abstraktion über die verschiedenen Systeme, die einen Wechsel oder eine Migration erleichtern könnten. Dies gilt jedoch nur, solange die eigenen Anforderungen mit der Schnittmenge aus Spring-Data abgebildet werden können. Manchmal muss auf Funktionen der konkreten Datenbank zurückgegriffen werden, welches dann eine Migration erschweren würde.
Ähnlich wertvoll wie die Abstraktion weg von der konkreten Datensenke, ist die Spring-typische Entwicklung mit guten Defaults und initial wenig eigenem Code. Die SpringBoot-Starter ermöglichen es sehr schnell und einfach eine Datenbank anzubinden und mittels ausgereifter Konventionen auf die Daten zuzugreifen, welche dann z.B. als REST-Backend für ein modernes JavaScript-Frontend exponiert werden können.
Dabei hilft auch die magische “Query derivation” in Spring Data JPA. Hier ermöglicht ein sogenanntes Repository den Zugriff auf selektierte Daten durch Methodennamen. So reicht der Funktionsname “findByName” aus, damit das Framework die Suche nach übergebenem Namen durchführt und die Ergebnisliste zurückgibt. Das führt dazu, dass der notwendige eigene Code auf ein Minimum reduziert wird.
Messaging
Während früher das Java-Messaging-System (JMS) weiter verbreitet war, schien kürzlich Kafka in manchen Kontexten vielversprechend. Zur Entkopplung von Systemen oder auch Arbeitsflüssen werden Message Broker angesprochen und können dank entsprechenden SpringBoot Startern leicht genutzt werden. Dennoch empfehlen wir den Einsatz im eigenen Kontext zu bewerten und nicht primär aus Neugierde oder Hype weitere Technologie-Bausteine einzubinden.
Security
Experten-Exkurse in OIDC und OAUTH2 zeigten die praktische Relevanz des Themas, welches schon lange über Username und Passwort hinausgeht. Authentifizierungs- und Autorisierungs-Protokolle stellen Zugriffsschutz sicher – auch in komplizierteren Fällen, beispielsweise der Sperrung eines Nutzers.
Test
Wer sich mit den Framework-Möglichkeiten beschäftigt, muss weniger in JUnit-Mocking investieren und wird dabei bessere Tests schreiben. Allgemein wird Testing leider in Projekten zu oft zu wenig Priorität eingeräumt. Dabei bewerten wir Qualitätssicherung und Wartbarkeit als sehr wichtig. Mit den richtigen Werkzeugen kann es sogar Spaß machen! 😃
Fazit
Wie bereits vor dem Besuch der empfehlenswerten Weiterbildung für uns feststand, hat sich hier nochmals umso mehr bewährt: SpringBoot ist zurecht eine sehr weit verbreitete Lösung zur effizienten Entwicklung von Backend-Services. Der Reifegrad der Konzepte und deren Implementierungen überzeugen. Auch wenn im eigenen Projekt eventuell nur eine Teilmenge dessen benötigt wurde, können wir aus Erfahrung empfehlen sich grundlegender und breiter damit zu beschäftigen. Dabei können gute Ansatzpunkte für Verbesserungen mitgenommen werden (z.B. Verbesserung des Testings). Ferner kann es für später folgende Anforderungen helfen einen breiteren Überblick über Framework-Features, vor allem das Ökosystem, zu haben.
Wir hoffen mit dem Lesen gut informiert und auch ein wenig unterhalten zu haben. Für Rückfragen und Feedback stehen wir gerne zur Verfügung.
Diesen Artikel teilen über: