Heute durfte ich einen Impusvortrag zum Thema Quarkus halten.
Den Inhalt der Folien incl. Kommentare und die Notizen der Live Demo kopiere ich hierher.
Quarkus
Was ist Quarkus?
• Open-Source-Framework
• Um Anwendungen für eine moderne, Cloud-native Welt zu erstellen
• Kubernetes-natives Java-Framework
• auf GraalVM und HotSpot zugeschnitten
• aus den besten Java-Bibliotheken und -Standards entwickelt
Was ist Quarkus? Traditionelle Java-Stacks wurden für monolithische Anwendungen mit langen Startzeiten und großem Speicherbedarf in einer Welt entwickelt, in der es noch keine Cloud, Container und Kubernetes gab. Java-Frameworks mussten sich weiterentwickeln, um den Anforderungen dieser neuen Welt gerecht zu werden. Quarkus wurde entwickelt, um Java-Entwicklern die Möglichkeit zu geben, Anwendungen für eine moderne, Cloud-native Welt zu erstellen. Quarkus ist ein Kubernetes-natives Java-Framework, das auf GraalVM und HotSpot zugeschnitten ist und aus den besten Java-Bibliotheken und -Standards entwickelt wurde. Ziel ist es, Java zur führenden Plattform in Kubernetes- und Serverless-Umgebungen zu machen und Entwicklern ein Framework zu bieten, das eine größere Bandbreite an verteilten Anwendungsarchitekturen abdeckt. Vollständig und absolut Open Source https://quarkus.io/about/
Ausgewählte Features
• Live-Coding mit Dev-Modus
• Microprofile-Integration für Cloud-native Anwendungen
• Nutzung von Quarkus für RESTful-Anwendungen
• Serverless Funktionen mit Quarkus Funqy
• Integration mit Datenbanken
• Performance
• Erweiterungen
Live-Coding mit Dev-Modus
Eine der herausragenden Eigenschaften von Quarkus ist die Möglichkeit des Live-Codings. Mit dem Dev-Modus können Entwickler Änderungen am Code vornehmen und diese Änderungen werden sofort in der laufenden Anwendung wirksam, ohne dass ein Neustart erforderlich ist. Dies beschleunigt den Entwicklungsprozess erheblich und ermöglicht eine iterative Entwicklung in Echtzeit.
Serverless Funktionen mit Quarkus Funqy
Eine API für verschiedenen FaaS-Umgebungen wie AWS Lambda, Azure Functions, Google Cloud Functions, Knative und Knative Events (Cloud Events), daher eine sehr einfache API.
Quarkus Funqy ist Teil der serverlosen Strategie von Quarkus und zielt darauf ab, eine portable Java-API zum Schreiben von Funktionen bereitzustellen, die in verschiedenen FaaS-Umgebungen wie AWS Lambda, Azure Functions, Google Cloud Functions, Knative und Knative Events (Cloud Events) eingesetzt werden können. Es ist auch als eigenständiger Dienst nutzbar. Da es sich bei Funqy um eine Abstraktion handelt, die mehrere verschiedene Cloud-/Funktionsanbieter und Protokolle umfasst, muss es eine sehr einfache API sein und verfügt daher möglicherweise nicht über alle Funktionen, die Sie von anderen Remoting-Abstraktionen gewohnt sind. Ein schöner Nebeneffekt ist jedoch, dass Funqy so optimiert und so klein wie möglich ist. Das bedeutet, dass Funqy zwar ein wenig an Flexibilität einbüßt, dafür aber einen Rahmen bietet, der wenig bis gar keinen Overhead hat.
Integration mit Datenbanken
Quarkus bietet Erweiterungen für verschiedene Datenbanken, wie z.B. PostgreSQL, MySQL, MongoDB und viele mehr.
Performance
Erweiterungen
Live Demo
Download
Import into Eclipse IDE
Prerequisites
Eclipse öffnen, Terminal mit Ubuntu (WSL) öffnen
Java und Maven Versionen überprüfen:
java --version echo $JAVA_HOME mvn --version # bei mir wird die Maven Version nicht angezeigt, wohl aber der Pfad der Installation, über den prüfe ich die Version ls - lisah /opt/maven cd /mnt/c/dev/workspace/code-with-quarkus/ clear
Start Quarkus
Starte Projekt:
./mvnw compile quarkus:dev
Internal Web Browser öffnen: http://localhost:8080/
„Visit the DEV UI“ funktioniert nicht im Eclipse Browser
Zeige „RESTeasy Reactive“-> @Path /hello
http://localhost:8080/hello
Hot Deployment
curl http://localhost:8080/hello
Zeige Klasse GreetingResource
Return String ändern und hello-Seite neu laden -> kein Neustart notwendig!
curl http://localhost:8080/hello
# In Klasse GreetingResource ändern von: @Produces(MediaType.TEXT_PLAIN) # nach: @Produces(MediaType.APPLICATION_JSON)
Änderung wird auch hier ohne Neustart übernommen, um sie zu zeigen verwende ich HTTPie statt cURL:
http http://localhost:8080/hello
Um das Hot Deployment für JUnit Tests zu zeigen gehe ich in das Terminal, mit dem ich Quarkus gestartet habe und drücke "r" für "re-run test".
Der Test schlägt fehlt, da ich in GreetingResource den Rückgabestring geändert hatte. Ich passe den zu erwartenden Wert in GreetingResourceTest an und drücke dann wieder "r" im Terminal. Alle Tests sind jetzt grün. Es war kein Neustart notwendig.
Contexts and Dependency Injection (CDI)
Klasse GreetingService hinzufügen:
package org.acme; import jakarta.enterprise.context.ApplicationScoped; @ApplicationScoped public class GreetingService { private String greeting = "Hallo"; public String greeting(String name) { return greeting + " " + name; } }
Die Klasse GreetingResource erweitern:
package org.acme; import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; @Path("/hello") public class GreetingResource { @Inject GreetingService service; @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "Hello from Welt"; } @GET @Produces(MediaType.TEXT_PLAIN) @Path("/greeting/{name}") public String greeting(String name) { return service.greeting(name); } }
Und wieder ohne Neustart testen:
http http://localhost:8080/hello/greeting/Welt
Configuration
Klasse GreetingService ändern:
package org.acme; import jakarta.enterprise.context.ApplicationScoped; @ApplicationScoped public class GreetingService { @ConfigProperty(name = "greeting") private String greeting; public String greeting(String name) { return greeting + " " + name; } }
Testen:
http http://localhost:8080/hello/greeting/Welt
Der Test schlägt fehl, da die Property greeting noch nicht gesetzt wurde, was wir jetzt nachholen:
greeting=Huhu
Testen:
http http://localhost:8080/hello/greeting/Welt
Jetzt funktioniert es und es kommt "Huhu Welt" zurück.
Staged Properties: In DEV Modus möchten wir eine andere Begrüßung sehen:
greeting=Huhu %dev.greeting=Moin
Testen:
http http://localhost:8080/hello/greeting/Welt
Es funktioniert und es kommt "Moin Welt" zurück.
Metrics
Testen:
http http://localhost:8080/q/metrics
Fehler: Not Found
Mit Maven nachinstallieren (alternativ: Gradle oder Quarkus CLI):
./mvnw quarkus:add-extension -Dextensions='quarkus-smallrye-metrics'
Testen:
http http://localhost:8080/q/metrics
ggf. ein paar Mal wiederholen dann gehts; wieder ohne Neustart
OpenAPI
Testen:
http http://localhost:8080/q/openapi
Fehler: Not Found
Mit Maven nachinstallieren (alternativ: Gradle oder Quarkus CLI):
./mvnw quarkus:add-extension -Dextensions='quarkus-smallrye-openapi'
Testen:
http http://localhost:8080/q/openapi
ggf. ein paar Mal wiederholen dann gehts; wieder ohne Neustart
In "richtigem" Browser zeigen das Swagger direkt mit enthalten ist:
Abschluss
Fragen
Wer hat schon Erfahrungen mit Quarkus sammeln können?
Wie war der persönliche Eindruck?
Wurde ggf. schon mal in einem Projekt gegen Quarkus entschieden?
Warum?
Diskussion
Quarkus vs. Spring Boot?