
Einführung
Am 7. März stellte RedHat (bald IBM) das neue Framework Quarkus vor . Laut den Entwicklern basiert dieses Framework auf GraalVM und OpenJDK HotSpot und wurde für Kubernetes entwickelt. Der Quarkus-Stapel enthält: JPA / Ruhezustand, JAX-RS / RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus und andere.
Ziel ist es, Java zur führenden Plattform für die Bereitstellung auf Kubernetes und die Entwicklung serverloser Anwendungen zu machen und Entwicklern einen einheitlichen Ansatz für die Entwicklung reaktiver und zwingender Stile zu bieten.
Wenn Sie sich diese Klassifizierung von Frameworks ansehen, befindet sich Quarkus irgendwo zwischen "Aggregatoren / Codegeneratoren" und "High-Level-Fullstack-Frameworks". Dies ist bereits mehr als ein Aggregator, erreicht aber auch nicht den Full-Stack, weil Grund für die Entwicklung des Backends.
Eine sehr hohe Anwendungsstartgeschwindigkeit und ein geringer Speicherverbrauch werden versprochen. Hier sind die Daten von der Entwicklerseite:
Zeit vom Start bis zur ersten Antwort (en):
Konfiguration | RUHE | 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 | RUHE | REST + JPA |
---|
Quarkus + GraalVM | 13 | 35 |
Quarkus + OpenJDK | 74 | 130 |
Traditioneller Cloud Native Stack * | 140 | 218 |
Beeindruckend, nicht wahr?
* Ich habe keine Informationen zu diesem Technologie-Stack gefunden. Wir können davon ausgehen, dass es sich um eine Art Spring Boot mit einem zusätzlichen Bodykit handelt .
Hallo Welt!
Die einfachste in Quarkus geschriebene Anwendung würde folgendermaßen aussehen:
@Path("/hello") public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "hello"; } }
Dies ist buchstäblich eine Klasse und es ist genug! Sie können die Anwendung mit Maven im Entwicklungsmodus starten:
mvn compile quarkus:dev … $ curl http://localhost:8080/hello hello
Im Gegensatz zur üblichen Anwendung gibt es keine Anwendungsklasse! Quarkus unterstützt das Hot-Reload, sodass Sie die Anwendung ändern können, ohne sie neu zu starten, und sich dadurch noch schneller entwickeln können.
Was weiter? Sie können dem Controller mithilfe der Inject- Annotation einen Service hinzufügen. Service Code:
@ApplicationScoped public class GreetingService { public String greeting(String name) { return "Hello " + 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 Hello developer!
Beachten Sie, dass Quarkus Standardanmerkungen aus bekannten Frameworks verwendet - CDI und JAX-RS. Sie müssen natürlich nichts Neues lernen, wenn Sie zuvor mit CDI und JAX-RS gearbeitet haben.
Arbeiten Sie mit der Datenbank
Wird von Hibernate- und Standard-JPA-Annotationen für Entitäten verwendet. Wie bei REST-Controllern müssen Sie ein Minimum an Code schreiben. Es reicht aus, die Abhängigkeiten in der Assembly-Datei anzugeben, die @Entity
Annotationen anzuordnen und die Datenquelle in application.properties zu konfigurieren.
Das ist alles. Keine sessionFactory, persistence.xml und andere Servicedateien. Wir schreiben nur den Code, der benötigt wird. Bei Bedarf können Sie jedoch eine persistence.xml-Datei erstellen und die ORM-Ebene genauer konfigurieren.
Quarkus unterstützt das Zwischenspeichern von Entitäten, Sammlungen für Eins-zu-Viele-Beziehungen sowie Abfragen. Auf den ersten Blick sieht es gut aus, aber es ist lokales Caching für einen einzelnen Kubernetes-Host. Das heißt, Caches verschiedener Knoten werden nicht miteinander synchronisiert. Ich hoffe das ist vorübergehend.
Asynchrone Codeausführung
Wie oben erwähnt, unterstützt Quarkus auch einen reaktiven Programmierstil. Der Code der vorherigen Anwendung kann in einer anderen Form geschrieben werden.
@Path("/hello") public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) @Path("/{name}") public CompletionStage<String> greeting(@PathParam("name") String name) { return CompletableFuture.supplyAsync(() -> { return "Hello " + name + "!"; }); } }
Asynchroner Code kann auch an den Dienst übertragen werden, das Ergebnis ist das gleiche.
Testen
Tests für Quarkus-Anwendungen können in JUnit4 oder JUnit5 geschrieben werden. Das Folgende ist ein Beispieltest für den Endpunkt. Er wurde mit RestAssured geschrieben, Sie können jedoch auch ein anderes Framework verwenden:
@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("Hello " + uuid + "!")); } }
Die Annotation @QuarkusTest fordert Sie auf, die Anwendung auszuführen, bevor Sie die Tests ausführen. Der Rest ist allen Entwicklern bekannt.
Da Quarkus eng in GraalVM integriert ist, kann natürlich plattformspezifischer Code generiert werden. Legen Sie dazu GraalVM fest und geben Sie die Umgebungsvariable GRAALVM_HOME an. Registrieren Sie als Nächstes ein Profil für die Assembly und geben Sie es beim Erstellen der Anwendung an:
mvn package -Pnative
Interessanterweise kann die generierte Anwendung getestet werden. Dies ist wichtig, da die Ausführung des „nativen“ Codes von der Ausführung in der JVM abweichen kann. Annotation @SubstrateTest führt plattformspezifischen Anwendungscode aus. Die Wiederverwendung des vorhandenen Testcodes kann mithilfe der Vererbung erfolgen. Daher sieht der Code zum Testen der plattformspezifischen Anwendung folgendermaßen aus:
@SubstrateTest public class GreetingResourceIT extends GreetingResourceTest { }
Das generierte Image kann in Docker gepackt und in Kubernetes oder OpenShift ausgeführt werden, wie in den Anweisungen ausführlich beschrieben.
Toolkit
Das Quarkus-Framework kann mit Maven und Gradle verwendet werden. Maven wird im Gegensatz zu Gradle voll unterstützt. Leider unterstützt Gradle derzeit die Erstellung eines leeren Projekts nicht. Die Site verfügt über ein detailliertes Tutorial .
Erweiterungen
Quarkus ist ein erweiterbares Framework. Derzeit gibt es etwa 40 Erweiterungen , die verschiedene Funktionen hinzufügen - von der Unterstützung des Spring DI-Containers und von Apache Camel bis zur Protokollierung und Veröffentlichung von Metriken für die Ausführung von Diensten. Zusätzlich zu Java gibt es bereits eine Erweiterung zur Unterstützung des Schreibens von Anwendungen in der Kotlin-Sprache.
Fazit
Meiner Meinung nach ist Quarkus ein Teil der Zeittrends. Die Entwicklung von Backend-Code wird immer einfacher, und dieses Framework vereinfacht und beschleunigt die Entwicklung von Diensten weiter und fügt Docker und Kubernetes „native“ Unterstützung hinzu. Ein großes Plus ist die integrierte Unterstützung für GraalVM und die Generierung plattformspezifischer Images, mit denen Sie Dienste sehr schnell starten und wenig Speicherplatz beanspruchen können. Dies ist sehr wichtig in unserer Zeit der massiven Begeisterung für Microservices und serverlose Architektur.
Die offizielle Website ist quarkus.io . Beispiele für Projekte für einen schnellen Start sind bereits auf GitHub .