Categories
Development Java

Quarkus

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

https://quarkus.io/

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

https://quarkus.io/about/
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.

https://quarkus.io/guides/funqy
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

https://code.quarkus.io/

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:

Swagger

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?

Leave a Reply

Your email address will not be published. Required fields are marked *