Trotzdem soll das Programmiermodell von Spring und teilweise auch dessen Syntax beibehalten werden. Möglich wird das durch den Fokus auf die GraalVM als zugrunde liegende Plattform mit Ahead of Time Compilation (AoC).
Spring - effizientes und akzeptiertes Framework, mit Stolperfallen
Seit mittlerweile mehr als 15 Jahren begeistert das Spring Framework SoftwareentwicklerInnen auf der ganzen Welt. Begonnen hat die Geschichte von Spring mit dem Anspruch, eine Alternative zur relativ komplexen Entwicklung von Java Enterprise Lösungen zu schaffen.
Dahinter stand der Leitgedanke, ein einfaches Programmiermodell zu bieten, das ohne aufwendige Konfiguration auskommt. Diesen Anspruch hat Spring in den letzten Jahren durchaus erfüllt und mitunter eines der meist verwendetsten Frameworks für Java Enterprise Anwendungen zur Verfügung gestellt.
Doch der Optimierungs-Gedanke in der Softwareentwicklung hat, trotz des in der Community breit akzeptierten und effizienten Programmiermodells von Spring, nicht behobene Nachteile aufgezeigt. Diese Nachteile lassen sich im weitesten Sinne auf den großzügigen Einsatz der Java Reflection API zurückführen, die Spring unter der Haube verwendet.
Diese hat zwei wesentliche Nachteile bezogen auf die allgemeine Leistung von großen Enterprise Applikationen. Zum einen eine längere Startzeit und zum anderen einen höheren Speicherbedarf zur Laufzeit. Vor allem im Microservice Umfeld schmerzen diese Nachteile von Spring.
Micronaut für den Einsatz als Microservice, im Serverless - und im IoT-Bereich
An dieser Stelle betritt Micronaut die Bühne. Micronaut will diese Probleme umgehen und eignet sich somit ideal für den Einsatz als Microservice, im Serverless- und im IoT-Bereich.
Wie schafft das Micronaut?
Es wird weitestgehends auf Reflections verzichtet und die Dependency Injection erfolgt zur Compile Zeit. Das bedeutet zwar, dass die Compile Time höher, aber die Startup-Zeit dafür schneller ist und konstant bleibt, unabhängig davon wie groß die Anwendung ist. Auch der Speicherverbrauch während der Laufzeit ist viel geringer.
Trotz der Änderungen kann der Programmier-Stil von Spring beibehalten werden. Ein Wechsel von Spring zu Micronaut ist daher ohne große Probleme möglich.
Zusätzlich unterstützt das Micronaut Framework reaktive Programmierung und Cloud Native Features wie z. B. Service Discovery. Seine Stärken kann das Micronaut Framework aber erst mithilfe der GraalVM so richtig ausspielen.
Die Vorteile von Micronaut mit der GraalVM voll nützen
Die GraalVM bietet einen verbesserten JIT Compiler, der optimierten Maschinencode produziert. Somit kann die maximale Leistung von JVM-Anwendungen erhöht werden. Aber trotzdem gibt es lange Startup-Zeiten und hohe Speicherauslastung.
Deshalb gibt es die Möglichkeit, den Ahead of Time Compiler der Graal VM zu nutzen. Hier wird der gesamte Quellcode vorab in den Maschinencode übersetzt. Diese sogenannten native Images haben dann eine viel kürzere Startup-Zeit und einen wesentlich niedrigeren Speicherverbrauch. Die Optimierungen können aber dazu führen, dass sich die maximale Leistung verringert und es gibt einige Einschränkungen, zum Beispiel bei der Verwendung von Reflections.
Die in der folgenden Grafik illustrierten Vorteile sind vor allem im Microservice und Serverless Umfeld von großer Bedeutung.
Das Framework wurde für die Verwendung für Microservice Architekturen oder in Serverless Infrastrukturen entwickelt. Wie oben beschriebenen ist das, auch in Verbindung mit der GraalVM, sehr gut gelungen und führt zu zahlreichen Vorteilen und neuen Features.
Es können Anwendungen jeglicher Größe wie gewohnt mit einem reaktiven Stack entwickelt werden, bei denen die Startup-Zeit und der Speicherverbrauch sehr gering bleiben. Zusätzlich helfen die eingebauten Features beim Entwickeln für Cloud Umgebungen.
Micronaut vs. Spring vs. Quarkus - Ein Vergleich
Die Nachteile von Micronaut
Micronaut hat in einigen Bereichen noch Aufholbedarf.
Es bietet generell weniger Features als Spring. Das fällt beispielsweise bei Hibernate auf. Hier kann noch nicht die volle Funktionalität genutzt werden, die man von etablierten Frameworks wie Spring gewohnt ist. Des Weiteren sind die Möglichkeiten bei den Properties und Configurations nicht so umfangreich.
Nachteile gibt es auch bei den Build Tools. Hier hinkt die Maven Unterstützung im Vergleich zu Gradle meist um eine Minor Version hinterher. Hinzu kommt, dass eine Maven Konfiguration bei der Kombination von Micronaut mit Kotlin und der Graal VM eine erhöhte Komplexität aufweist. Der Einsatz von Gradle scheint dabei etwas leichter von der Hand zu gehen.
Die Vorteile durch die Ahead of Time Kompilierung werden natürlich vom Nachteil der längeren Compile Time vor allem bei großen Anwendungen überschattet. Das kann unter Umständen bei großen Projekten einiges an Zeit bedeuten. Wobei erwähnt werden sollte, dass beim richtigen Einsatz von Micronaut als kleine leichtgewichtige Anwendungen dieser Nachteil nicht so schwerwiegend ist.
Die Unterstützung der GraalVM ist leider noch nicht zu 100% ausgereift. Es wurde erst vor kurzem offiziell als Production ready eingestuft und Bugs sind nicht ausgeschlossen.
Micronaut und Kotlin - unsere persönliche Erfahrung
Wir nutzten bei der Analyse des Frameworks Kotlin als Programmiersprachen und können dies auf jeden Fall weiterempfehlen. Die Features der Sprache passen ideal zum Programmiermodell von Micronaut. Auch die Verbindung mit Gradle als Build-Tool stellte sich als gute Kombination heraus. Alleine die Reduktion der Lines of Code im Vergleich zu Java ist schon ein gutes Argument für den Umstieg zu Kotlin. Aber auch die zahlreichen Features, wie etwa Coroutines und vereinfachte Null-Safety, machen das Leben eines Entwicklers leichter.
Ein kurzer Recap
Sucht man neue Technologien oder Alternativen im Java Umfeld für leichtgewichtige Microservice Anwendungen, dann sollte man in seinen Recherchen auf keinen Fall auf das Micronaut Framework vergessen.
Das Framework strebt an, genau hier eine gute Alternative zu Spring zu werden und mit den erwähnten Verbesserungen und Features ist der erste Schritt auf jeden Fall sehr gut gelungen. Noch fehlt ein wenig die Community, welche Spring so stark macht, auch der Reifegrad ist noch nicht auf dem Level von Spring.
Nichtsdestotrotz muss es auch kein Gegeneinander sein. Die beiden Frameworks können in Zukunft enorm voneinander profitieren. EntwicklerInnen können sehr einfach beide Frameworks parallel nutzen und je nach Anwendungsgebiet variieren, denn es muss ja nicht jeder Microservice dieselbe Technologie nutzen.
Das Micronaut Framework ist auf jeden Fall einen genaueren Blick wert und der Umstieg von Spring geht wirklich leicht vonstatten.