
Einführung
Am siebten März wird die Firma RedHat (bald IBM) ein neues Framework — . Laut den Entwicklern basiert dieses Framework auf GraalVM und OpenJDK HotSpot und ist für Kubernetes gedacht. Der Quarkus-Stack umfasst: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus und andere.
Das Ziel der Entwicklung ist es, Java zur führenden Plattform für die Bereitstellung in Kubernetes und die Entwicklung serverloser Anwendungen zu machen, indem den Entwicklern ein einheitlicher Ansatz für die Entwicklung sowohl im reaktiven als auch im imperativen Stil geboten wird.
Wenn man sich die Klassifikation der Frameworks ansieht, befindet sich Quarkus irgendwo zwischen „Aggregatoren/Code-Generatoren“ und „High-Level Fullstack-Frameworks“. Es ist bereits mehr als ein Aggregator, kommt aber nicht ganz an Full-Stack heran, da es auf die Backend-Entwicklung ausgelegt ist.
Es wird eine sehr hohe Geschwindigkeit beim Start der Anwendung und ein geringer Speicherverbrauch versprochen. Hier sind die Daten von der Website des Entwicklers:
Zeit vom Start bis zur ersten Antwort (s):
Konfiguration
REST
REST+JPA
Quarkus+GraalVM
0.014
0.055
Quarkus+OpenJDK
0.75
2.5
Traditioneller Cloud-Native-Stack*
4.3
9.5
Speicherverbrauch (Mb):
Konfiguration
REST
REST+JPA
Quarkus+GraalVM
13
35
Quarkus+OpenJDK
74
130
Traditioneller Cloud-Native-Stack*
140
218
Beeindruckend, nicht wahr?
*Informationen zu diesem Technologiestack habe ich nicht gefunden, man kann vermuten, dass es sich um eine Art Spring Boot mit zusätzlicher Ausrüstung handelt..
4) Wechseln Sie in das Verzeichnis, in das Sie das Beispielprojekt heruntergeladen haben:
Das einfachste auf Quarkus geschriebene Programm würde so aussehen:
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
}Das ist buchstäblich eine Klasse und das reicht aus! Die Anwendung kann mit Maven im Entwicklungsmodus gestartet werden:
mvn compile quarkus:dev
…
$ curl http://localhost:8080/hello
helloDer Unterschied zu einer üblichen Anwendung ist — es gibt keine Klasse Application! Quarkus unterstützt Hot Reload, sodass man die Anwendung ändern kann, ohne sie neu zu starten, was die Entwicklung noch schneller macht.
Was kommt als Nächstes? Man kann einen Dienst im Controller mit der Annotation hinzufügen . Der Dienstcode:
@ApplicationScoped
public class GreetingService {
public String greeting(String name) {
return "Hallo " + name + "!";
}
}Controller:
@Path("/hello")
public class GreetingResource {
@Inject
GreetingService service;
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/{name}")
public String greeting(@PathParam("name") String name) {
return service.greeting(name);
}
}$ curl http://localhost:8080/hello/developer
Hallo Entwickler!Beachten Sie, dass in Quarkus die Standardannotation aus den vertrauten Frameworks — CDI und JAX-RS — verwendet werden. Es ist nichts Neues zu lernen, wenn Sie zuvor mit CDI und JAX-RS gearbeitet haben.
Arbeiten mit der Datenbank
Hibernate und standardmäßige JPA-Annotationen für Entitäten werden verwendet. Wie bei REST-Controllern muss nur wenig Code geschrieben werden. Es reicht aus, die Abhängigkeiten in der Build-Datei anzugeben und die Annotationen zu setzen. @Entity und die Datenquelle in der application.properties zu konfigurieren.
Das war's. Keine sessionFactory, persistence.xml und andere Service-Dateien. Wir schreiben nur den Code, der benötigt wird. Bei Bedarf kann jedoch eine persistence.xml-Datei erstellt werden, um die ORM-Schicht feiner zu konfigurieren.
Quarkus unterstützt das Caching von Entitäten, Sammlungen für Eins-zu-viele-Beziehungen sowie Abfragen. Auf den ersten Blick sieht das großartig aus, aber es ist lokales Caching für einen einzelnen Kubernetes-Knoten. Das bedeutet, dass die Caches verschiedener Knoten nicht untereinander synchronisiert sind. Ich hoffe, das ist nur vorübergehend.
Asynchrone Codeausführung
Wie bereits erwähnt, unterstützt Quarkus auch den reaktiven Programmierstil. Der Code der vorherigen Anwendung kann in anderer Form geschrieben werden.
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/{name}")
public CompletionStage greeting(@PathParam("name") String name) {
return CompletableFuture.supplyAsync(() -> {
return "Hallo " + name + "!";
});
}
}Asynchroner Code kann auch in einen Service verschoben werden, das Ergebnis bleibt dasselbe.
Tests
Tests für Quarkus-Anwendungen können mit JUnit4 oder JUnit5 geschrieben werden. Im Folgenden ist ein Beispieltest für den Endpoint, der mit RestAssured geschrieben wurde, aber auch ein anderer Rahmen kann verwendet werden:
@QuarkusTest
public class GreetingResourceTest {
@Test
public void testGreetingEndpoint() {
String uuid = UUID.randomUUID().toString();
given()
.pathParam("name", uuid)
.when().get("/hello/{name}")
.then()
.statusCode(200)
.body(is("Hallo " + uuid + "!"));
}
}Die Annotation @QuarkusTest weist an, die Anwendung zu starten, bevor die Tests ausgeführt werden. Ansonsten ist der Code bekannt und vertraut für alle Entwickler.
Plattformabhängige Anwendung
Da Quarkus eng mit GraalVM integriert ist, kann natürlich plattformabhängiger Code generiert werden. Dazu muss GraalVM installiert und die Umgebungsvariable GRAALVM_HOME gesetzt werden. Dann und bei der Erstellung der Anwendung angegeben werden:
mvn package -PnativeInteressanterweise kann die generierte Anwendung getestet werden. Das ist wichtig, da die Ausführung von „nativem“ Code von der Ausführung auf der JVM abweichen kann. Die Annotation @SubstrateTest führt plattformabhängigen Code der Anwendung aus. Die Wiederverwendung bestehenden Testcodes kann durch Vererbung erfolgen, sodass der Code zum Testen einer plattformabhängigen Anwendung so aussieht:
@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {
}Das generierte Bild kann in Docker verpackt und in Kubernetes oder OpenShift ausgeführt werden, was detailliert beschrieben ist in .
Werkzeug
Das Framework Quarkus kann mit Maven und Gradle verwendet werden. Maven wird vollständig unterstützt, im Gegensatz zu Gradle. Leider unterstützt Gradle derzeit nicht die Erstellung eines leeren Projekts, es gibt auf der Website detaillierte .
Erweiterungen
Quarkus ist ein erweiterbares Framework. Momentan gibt es etwa , die verschiedene Funktionalitäten hinzufügen – von der Unterstützung von und bis hin zu Logging und der Veröffentlichung von Metriken für laufende Dienste. Außerdem gibt es bereits eine Erweiterung zur Unterstützung der Anwendungsentwicklung in Kotlin, zusätzlich zu Java.
Fazit
Meiner Meinung nach ist Quarkus durchaus im Trend. Die Entwicklung von Backend-Code wird immer einfacher, und dieses Framework vereinfacht und beschleunigt die Entwicklung von Diensten noch weiter, indem es native Unterstützung für Docker und Kubernetes hinzufügt. Ein großer Vorteil ist die eingebaute Unterstützung von GraalVM und die Erstellung plattformabhängiger Bilder, was es ermöglicht, Dienste wirklich schnell startfähig und speichersparend zu machen. Das ist in der heutigen Zeit, in der Mikroservices und serverlose Architekturen im Trend liegen, sehr wichtig.
Die offizielle Website ist – . Beispiele für Projekte zum schnellen Start sind bereits auf .
Quelle: habr.com
