Codineers Meetup Rosenheim, 10.02.22, online, Franz Wimmer (Twitter: @zalintyre, Senior Software Engineer bei QAware).
== Dokument bitte herunterladen, falls unscharf! Please download slides if blurred! ==
Abstract:
Seit 2019 gibt es einen neuen Stern am Enterprise-Java-Himmel: Quarkus. Um den bewährten Frameworks wie Java EE oder Spring den Rang abzulaufen, wird hier vieles anders gemacht. "Container First" und "Reactive" sind die zwei Buzzwords, mit denen Quarkus ins Rennen geht. Komplett auf der reaktiven Plattform "Vert.x" aufgebaut, sollen Quarkus-Anwendungen komplett anders als bisher gebaut werden.
In diesen Slides des Vortrags lernen wir einige der Konzepte von Quarkus kennen - z.B. Reactive Everything mit Mutiny und Vert.x, Web Services mit RestEasy oder einfache Datenbank-Zugriffe mit Panache. Wir schauen uns an, wie man Quarkus-Anwendungen mit GraalVM zu einem nativen Binary kompilieren kann.
Außerdem werfen wir einen kurzen Blick auf die Performance und Serienreife (oder "Production readiness") von Quarkus. Es muss sich im Vergleich mit seit Jahren unter vielfältigsten Bedingungen eingesetzten JEE-Appservern beweisen. Damit können wir bewerten, ob das System ausgereift genug für den Kundeneinsatz ist.
2. Franz Wimmer
Senior Software Engineer, QAware GmbH
2
Studium Informatik an der TH Rosenheim
Seit 4 Jahren bei QAware
Entwicklung von Cloud Native Applications
Vorlesung “Cloud Computing” @ TH Rosenheim
Vorträge
4. Einführung
■ Quarkus ist ein reaktives Framework für Webanwendungen.
■ 1. Commit am 12.12.2018
■ Maßgeblich entwickelt von RedHat.
■ Enterprise-Support!
■ Tritt an als Konkurrenz zu Java EE, Spring, ...
■ Spielt optimal mit GraalVM zusammen
5. Architektur
■ Ihr habt die Wahl zwischen “Java EE” oder anderen Web-Technologien (z.B. RESTeasy).
■ Frei kombinierbar!
■ Bestehende Java-EE-Anwendungen können fast 1:1 übernommen werden.
■ Quarkus sitzt auf der reaktiven Plattform “Eclipse Vert.x”
– Vert.x gibt es seit 2011.
– Nebenläufig und asynchron
– Verteilter
7. Was bedeutet noch mal... “reactive”?
■ Das “Reaktive Manifest” besagt: Reaktive Systeme sind ...
– Antwortbereit
– Widerstandsfähig
– Elastisch
– Nachrichtenorientiert
■ Das kann jetzt bedeuten, dass man...
– ... viele kleine Microservices baut
– ... reaktive Frameworks wie Kafka, Spark oder Akka verwendet
– Das geht aber auch in der Anwendung selbst.
9. Reactive Programming in Quarkus - 2
■ Reaktiver Code in Quarkus spart:
– Kontext-Switches
– Große Threadpools
– Resourcen allgemein
– Reaktiver Code darf nicht blocken!
10. Smallrye Mutiny – Uni
■ Uni ist eine asynchrone Operation, die ein Ergebnis zurückgeben kann:...
■ die Daten kann man auch weiter verarbeiten:
■ Und am Ende alles zusammensammeln:
Uni<VaccinationsResponse> vaccinationsResponse = vaccionationsClient.getVaccinations();
Uni<CountryStatisticsResponse> germanStatisticsResponse = statisticsClient.getStatisticsForGermany();
Uni<DistrictsStatistcsResponse> districtsStatisticsResponse = statisticsClient.getDistrictStatistics();
Uni<DistrictStatisticsData> = districtsStatisticsResponse
.map(DistrictsStatistcsResponse::getDistrictsStatisticsResponseData)
.map(DistrictsStatisticsResponseData::getDistrictStatisticsMap)
.map(districts -> districts.get(countyCode))
.map(DistrictStatisticsData::of);
return Uni.combine()
.all()
.unis(vaccinationsData, statisticsData, districtStatisticsData)
.combinedWith((vaccinations, statistics, districtStatistics) -> CovidData.builder()
.vaccinationsData(vaccinations)
.statisticsData(statistics)
.districtStatisticsData(districtStatistics)
.build());
11. Smallrye Mutiny – Multi
■ Multis sind asynchrone Streams – damit behandelt man ganze Mengen an Daten:
■ Mutiny geht auch wunderbar mit JAX-RS:
■ ... oder mit Datenbanken:
public Multi<String> greetings(int count, String name) {
return Multi.createFrom()
.ticks().every(Duration.ofSeconds(1))
.onItem().transform(n -> String.format("Hello %s - %d", name, n))
.transform().byTakingFirstItems(count);
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/greeting/{count}/{name}")
public Multi<String> greetings(int count, String name) {
return service.greetings(count, name);
}
public static Multi<Fruit> findAll(PgPool client) {
return client.query("SELECT id, name FROM fruits ORDER BY name ASC").execute()
// Create a Multi from the set of rows:
.onItem().transformToMulti(set -> Multi.createFrom().items(() -> StreamSupport.stream(set.spliterator(), false))
// For each row create a fruit instance
.onItem().transform(Fruit::from);
}
12. Smallrye Mutiny - Fehlerbehandlung
■ Automatischer Retry:
■ Oder mit einem Default aufgeben
Uni<String> uni = invokePickyService(client)
.onFailure()
.retry()
.withBackOff(Duration.ofSeconds(1))
.withJitter(0.2)
.atMost(10);
Uni<String> result = uni
.onFailure()
.recoverWithItem("Default");
14. Native Images mit GraalVM
■ Quarkus ist ja ganz nett... aber der Overhead?
■ ... immerhin braucht die JVM mit dem Appserver viel Speicher und Zeit zum Hochfahren.
■ Mit GraalVM kann man ganz einfach ein natives Binary erzeugen (siehe Demo).
■ Dieses Binary braucht keine JVM mehr. Ein Unix-System reicht.
■ Aber Vorsicht: GraalVM linkt dynamisch gegen die glibc auf eurem Rechner!
■ Deswegen: Lieber in einem Container bauen.
■ Für Debugging müssen Debug-Symbole mitkompiliert werden!
■ Und: Ihr debuggt dann mit gdb. Viel Vergnügen
17. Performance
■ Quarkus muss sich natürlich mit etablierten Technologien in der Nachbarschaft messen lassen.
■ Der folgende Benchmark stammt von GitHub.
■ Anwendung: JAX-RS, JSON-B, CDI, JPA & PostgresDB
– Keine reactive-Komponenten
■ Technologien:
– Quarkus (JVM)
– Quarkus (native)
– Payara Micro
– Spring Boot (JVM)
–
23. Fazit
■ Quarkus macht vor allem Spaß!
■ Wer Java EE oder Spring kennt, wird keine Probleme bei der Einarbeitung haben.
■ Bonus: JEE-Anwendungen lassen sich 1:1 übernehmen.
■ Die Dokumentation ist echt gut.
■ Quarkus hat aber auch noch ein paar Kinderkrankheiten.
– z.B. Bugs, in die man auch mit kleinen Showcases läuft.
– Vorsicht bei der Kombination von normalen mit reactive Bibliotheken!
24. Zum Nachschlagen...
■ Website & Dokumentation: https://quarkus.io/
■ Skeleton-Generator: https://code.quarkus.io/
■ Das Reaktive Manifest: https://www.reactivemanifesto.org/de
■ Umfangreiche Benchmarks Quarkus vs. Spring Boot vs. Payara:
https://github.com/rmh78/quarkus-performance
■ NEINhorn: https://neinhorn.codefoundry.de
■ NEINhorn @ GitHub (AGPL 3.0): https://github.com/zalintyre/neinhorn
25. qaware.de
QAware GmbH
Aschauer Straße 32
81549 München
Tel. +49 89 232315-0
info@qaware.de
twitter.com/qaware
linkedin.com/company/qaware-gmbh
xing.com/companies/qawaregmbh
slideshare.net/qaware
github.com/qaware
Q & A