Vergleich Spring Boot vs Micronaut vs Quarkus
In diesem Blog Beitrag geht es um den Vergleich der beiden Frameworks Micronaut und Quarkus mit Spring Boot.
Micronaut
Micronaut ist „ein modernes, JVM-basiertes Full-Stack-Framework für den Aufbau modularer, leicht testbarer Microservice- und Serverless-Anwendungen.“ [1]
Dabei unterstützt Micronaut Sprachen wie
- Java
- Kotlin
- Groovy
Vorteile
Micronaut zielt auf folgende Aspekte von Anwendungen für die JVM ab und versucht, sie zu optimieren:
- schneller Applikationsstart
- reduzierter Laufzeit-Speicherbedarf
- minimaler Einsatz von Java Reflection
- minimaler Einsatz von Java Proxies
- einfache, schnelle Applikationstests
Die schnelle Startzeit fällt sowohl bei der Entwicklung und der Ausführung von Integrationstests als auch bei einem Kaltstart als AWS-Lambda-Funktion positiv auf. Aufgrund des geringen Speicherbedarfs zur Laufzeit eignet sich Micronaut besonders für die Entwicklung von „Serverless“-Anwendungen. Damit verbunden wirbt das Entwicklungsteam vor allem mit dem inhärenten Cloud-Support, der keine zusätzlichen externen Abhängigkeiten benötigt, sondern Teil des Ökosystems ist. [2]
Eine Beispielmessung der Seite w-jax zeigt den genauen Vergleich:
Die Abbildung zeigt die Verbesserungen von Micronaut gegenüber Spring. Während die Compile-Zeit nun signifikant länger ist, kann das Framework bei anderen Metriken punkten. Dabei ist zu beachten, dass die Startzeit je nach Größe der Anwendung bei Spring immer länger wird, während die Startzeit der MicronautAnwendung relativ konstant bleibt. [3]
Quarkus
Quarkus ist ein Fullstack-Framework, das eine ganze Reihe von Bibliotheken integriert. Hierbei wird stark auf bewährte Bibliotheken, wie z.B. Hibernate, RESTEasy oder Apache Kafka, gesetzt. Das Ziel hierbei ist, dass Entwickler nicht viel Zeit investieren müssen, um neue Technologien zu lernen, sondern mit bewährten Bibliotheken und Standards arbeiten können. Quarkus sieht sich hierbei nicht nur als einfacher Konsument, sondern möchte auch daran teilhaben die verwendeten Bibliotheken zu verbessern.Viele der Bibliotheken, die in Quarkus verwendet werden, müssen vorher für das Framework optimiert werden. Quarkus verzichtet so gut es geht auf Reflection, und da viele Frameworks stark darauf ausgelegt sind, müssen diese angepasst werden. Es stehen hierzu eine Reihe von Erweiterungen bereit, welche für Quarkus genutzt werden können. Diese liefern direkt die optimierten Versionen der Bibliotheken. [5]
Vergleich der „HelloWorld“-Anwendungen
Framework | Durchschnittliche Zeit bis zum kompletten Startup | Arbeitsspeicher Auslastung |
Micronaut | 1,83 Sekunden | 98 MB |
Quarkus | 1,12 Sekunden | 70 MB |
Spring Boot | 2,55 Sekunden | 215 MB |
Es wird deutlich, dass die beiden Frameworks im Vergleich mit Spring Boot etwas schneller sind und weniger Arbeitsspeicher Auslastung haben, wobei Quarkus das beste Ergebnis erzielt hat.
Migration von Spring Boot zu Micronaut/Quarkus
Micronaut for Spring
Weise kann eine Anwendung geschrieben werden, die ohne Änderung in eine andere Spring- oder Mikronaut-Anwendung importiert werden kann.
Im Gegensatz zu herkömmlichen, auf Laufzeitreflexion basierenden Frameworks verwendet Micronaut die Ahead of Time (AOT)-Kompilierung, sodass es keinen Laufzeit-Overhead für die Unterstützung eines zusätzlichen Satzes von Annotationen gibt (in diesem Fall Spring’s Annotation Programming Model).
Vorteile sind:
- Es kann die kompilierte Anwendung genommen und ohne Änderungen in eine andere Spring oder Micronaut Anwendung eingebunden werden.
- Ein bestehendes Team von Spring-Entwicklern kann mit Micronaut arbeiten, ohne eine neue Annotation DSL zu lernen.
Man sollte dabei beachten, dass Spring riesig ist und nur einige Teile unterstützt werden. [7]
Bemerkung: Bei Micronaut for Spring wurde die Startup Zeit bei jedem Neustart geringer. So startete es beim ersten Start mit 5,8 Sekunden und brauchte nach einigen weiteren Starts nur noch 3,8 Sekunden.
Quarkus
Die Controller Klassen heißen hier Resource Klassen und müssen mit der Annotation @Path() eingeleitet werden.
@Path("/") public class HelloWorldResource{ @GET @Path("/hello") public String helloWorld(){ return "hello"; } }
Vergleich
Durchschnittliche Zeit bis zum kompletten Startup | Arbeitsspeicher Auslastung | |
Nur Spring Boot | 6,8 Sekunden | 800 MB |
Micronaut for Spring | 3,9 Sekunden | 210 MB |
Micronaut ohne Spring | 2,2 Sekunden | 130 MB |
Quarkus | 1,2 Sekunden | 87 MB |
Fazit
Am einfachsten war es, ein bestehendes Projekt mit Micronaut for Spring umzuformen, da man mit kleinen Änderungen in der pom das Projekt schneller und arbeitsspeichersparender machen kann.
Allerdings ist Micronaut for Spring natürlich nicht so schnell und arbeitsspeichersparend wie Micronaut oder Quarkus alleine.
Es fiel mir allerdings leichter, den bestehenden Spring Boot Code in Quarkus umzuschreiben, da Quarkus mit Jersey arbeitet und sich die bestehenden Annotationen einfacher ersetzen lassen.
Von Quarkus in Micronaut umzuformen ist dann genau so leicht, da sich die Micronaut Annotationen stark an Jersey orientieren.
An sich hat mir Quarkus am besten gefallen. Auch hat Quarkus die besten Ergebnisse im Test erzielt, wie man in der obigen Tabelle sieht. Die Zeit zum kompletten Startup ist um einiges geringer und arbeitsspeichersparender als bei den anderen Frameworks.
Wobei Micronaut nicht viel schlechter abschneidet.
Beide Frameworks sind unter der Apache License v2 lizenziert. [8]
> Spring Boot Code in Quarkus
Dazu würde ich gerne mehr lesen.