Spring Boot: Vom Hype zur etablierten Basistechnologie?

Seite 2: Spring Boot und Microservices

Inhaltsverzeichnis

Der Hype um Microservices, die lange als Allheilmittel aller IT-Probleme galten, lässt allmählich nach und weicht einer differenzierteren Betrachtung. Spring Boot ist allerdings stark mit dem Begriff Microservice verbunden. Woher kommt das?

Die Grundlagen von Spring Boot entstanden in der anfänglichen Boomphase der Microservices. Auch das erwähnte Deployment-Muster eines self-contained-jar oder auch fat-jar hat sicherlich dazu beigetragen. Außerdem kommt Spring Boot ganz oft und selbstverständlich zusammen mit Spring Cloud zum Einsatz. Spring Cloud enthält unter anderem Teile des Open-Source-Netflix-Stacks, aber auch viele weitere Module, die das Erstellen verteilter, cloud-basierter Ansätze erheblich vereinfachen.

Spring Boot lässt sich jedoch auch hervorragend ohne den Stack für den Bau klassischer monolithischer Anwendungen oder Batch-Prozesse nutzen, und es ist kein Microservice-Framework, als das es häufig fälschlicherweise dargestellt wird. Daher gilt auch hier: Es gibt keine Silver Bullet, die mögliche Probleme im Vorfeld abwendet und in jedem Kontext die eine perfekte Architektur bietet.

Ein Mittelweg könnten die modularen Monolithen namens "Moduliths" von Oliver Drotbohm weisen. Der Ansatz versteht Standard-Java-Packages als Grenze logischer, fachlicher Module. In seinem Buch "Spring Boot 2 – Moderne Softwareentwicklung mit Spring 5" verfolgt der Autor dieses Artikels einen ähnlichen Ansatz. Dabei gilt es, Vertikale auf Package-Ebene zu bilden, die dann aber in der Regel horizontal zu testen sind. Ein Beispiel zu dem Ansatz beschreibt Domain- und Test-driven Development mit Spring Boot 2. Moduliths gehen noch einen Schritt weiter und stellen über Boots flexible Schnittstellenintegrationstests zur Verfügung, die es ermöglichen, ein Package als Gesamtmodul zu starten und zu testen.

Der Moduliths-Ansatz zeigt darüber hinaus die Nutzung moderner Werkzeuge zur Qualitätsverbesserung von Spring-Boot-Anwendungen. Exemplarisch genannt seien beispielsweise ArchUnit, ein Werkzeug zur Analyse von Typen auf Package-Ebene, Structurizr, ein Werkzeug zur Beschreibung und Visualisierung von Softwarearchitektur mit Spring-Integration, und jQAssistant, ein auf der Graphdatenbank Neo4j aufbauendes Tool, das Analysen auf allen Ebenen ermöglicht.

Spring Boot bietet Integrationen für eine Vielzahl von Projekten (Datenbanken, Event Stores etc.). Die Integrationen sind in der Regel ressourcenschonend und lassen sich über den erwähnten Starter-Mechanismus bereitstellen. Erst die Deklaration einer Abhängigkeit aktiviert die automatische Konfiguration, sodass sie bis dahin nicht zum Ressourcenverbrauch einer Anwendung beiträgt.

Ein Spring-Boot-Projekt kann sehr klein, aber auch sehr groß sein – abhängig davon, welche Integrationen es benötigt. Diese Flexibilität spricht nach Einschätzung des Autors für den Einsatz von Spring Boot in Projekten. Das typische Standardprojekt gibt es nicht, da die meisten Domainen spezielle Eigenheiten haben. Allerdings fehlt häufig die Zeit, um für jeden Dienst, der eine Interaktion erfordert, eine eigene Integration zu schreiben.

Eine vollständige Übersicht aller offiziell in Spring Boot unterstützten Themen bietet der Spring Initializr, der über "Switch to the full version" mehr als 110 Markierungsfelder zur Auswahl von Startern anbietet. Kreuzt man alle auf einmal an, erhält man – nach geraumer Wartezeit – ein ausführbares Jar-File, das rund 270 MByte groß ist und alle der mehr als 1000 aufgeführten Konfigurationseigenschaften unterstützt. Ein solches Projekt zu erstellen, ist in der Praxis wenig sinnvoll, macht aber die Bandbreite der mittlerweile unterstützten Bibliotheken deutlich.

Ohne die Spring-Cloud-Projekte zu betrachten, bleiben die im Folgenden beleuchteten, großen Themen übrig. Für die gilt: Die Konfiguration erfolgt über den Konfigurationsmechanismus von Spring Boot. Daher ist es in der Regel nicht notwendig, besondere Klassen bereitzustellen oder Beans manuell zu erzeugen. Alle notwendigen Informationen lassen sich extern bereitstellen, sei es über Umgebungsvariablen, Parameter oder Konfigurationsdateien in unterschiedlichen Formen.