Quarkus ist ein subatomarer Überschall-Java. Kurzer Überblick über das Framework

Quarkus ist ein subatomarer Überschall-Java. Kurzer Überblick über das Framework

Einführung

Am XNUMX. März wurde RedHat (bald IBM) präsentiert neuer Rahmen - Quark. Nach Angaben der Entwickler basiert dieses Framework auf GraalVM und OpenJDK HotSpot und ist für Kubernetes konzipiert. Der Quarkus-Stack umfasst: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus und andere.

Ziel ist es, Java zur führenden Plattform für die Kubernetes-Bereitstellung und serverlose Anwendungsentwicklung zu machen und Entwicklern einen einheitlichen Ansatz für die Entwicklung sowohl im reaktiven als auch imperativen Stil zu bieten.

Wenn man hinschaut diese Klassifizierung von Frameworks, dann liegt Quarkus irgendwo zwischen „Aggregatoren/Codegeneratoren“ und „High-Level-Fullstack-Frameworks“. Dies ist bereits mehr als ein Aggregator, aber es erreicht nicht einmal den Full-Stack, weil... maßgeschneidert für die Backend-Entwicklung.

Es werden eine sehr hohe Geschwindigkeit beim Anwendungsstart und ein geringer Speicherverbrauch versprochen. Hier sind die Daten von der Website des Entwicklers:

Zeit vom Start bis zur ersten Antwort(en):

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?

*Ich habe keine Informationen zu diesem Technologie-Stack gefunden, wir können davon ausgehen, dass es sich um eine Art Spring Boot mit zusätzlichem Bodykit handelt.

Hallo Welt!

Die einfachste in Quarkus geschriebene Anwendung würde so aussehen:

@Path("/hello")
public class GreetingResource {

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   public String hello() {
       return "hello";
   }
}

Es ist buchstäblich eine Klasse und das ist genug! Sie können die Anwendung mit Maven im Entwicklungsmodus ausführen:

mvn compile quarkus:dev
…
$ curl http://localhost:8080/hello
hello

Der Unterschied zu einer regulären Anwendung besteht darin, dass es keine Anwendungsklasse gibt! Quarkus unterstützt Hot Reload, sodass Sie Ihre Anwendung ändern können, ohne sie neu starten zu müssen, was die Entwicklung noch schneller macht.

Was weiter? Sie können einem Controller mithilfe einer Anmerkung einen Dienst hinzufügen Injizieren. Service code:

@ApplicationScoped
public class GreetingService {

   public String greeting(String name) {
       return "Hello " + name + "!";
   }
}

Regler:

@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. Wenn Sie bereits mit CDI und JAX-RS gearbeitet haben, müssen Sie natürlich nichts Neues lernen.

Arbeiten mit der Datenbank

Es werden 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 Assemblydatei anzugeben und Anmerkungen hinzuzufügen @Entity und konfigurieren Sie die Datenquelle in application.properties.

Alle. Keine sessionFactory, persistence.xml oder andere Servicedateien. Wir schreiben nur den Code, der benötigt wird. Bei Bedarf können Sie jedoch eine Datei persistence.xml erstellen und die ORM-Ebene feiner konfigurieren.

Quarkus unterstützt das Caching von Entitäten, Sammlungen für Eins-zu-viele-Beziehungen und Abfragen. Auf den ersten Blick sieht es toll aus, ist es aber lokal Caching für einen Kubernetes-Knoten. Diese. Die Caches verschiedener Knoten sind nicht miteinander synchronisiert. Ich hoffe, das ist nur vorübergehend.

Asynchrone Codeausführung

Wie oben erwähnt unterstützt Quarkus auch den 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 + "!";
       });
   }
}

Es kann auch asynchroner Code an den Dienst übergeben werden, das Ergebnis ist das gleiche.

Testing

Tests für Quarkus-Anwendungen können in JUnit4 oder JUnit5 geschrieben werden. Nachfolgend finden Sie einen Beispieltest für einen Endpunkt. Er wurde mit RestAssured geschrieben, es kann jedoch auch ein anderes Framework 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("Hello " + uuid + "!"));
   }
}

Die Annotation @QuarkusTest weist Sie an, die Anwendung auszuführen, bevor Sie Tests ausführen. Der Rest ist Code, der allen Entwicklern bekannt ist.

Plattformspezifische Anwendung

Da Quarkus eng mit GraalVM integriert ist, ist es natürlich möglich, plattformspezifischen Code zu generieren. Dazu müssen Sie GraalVM installieren und die Umgebungsvariable GRAALVM_HOME angeben. Weiter Registrieren Sie ein Profil für die Montage und geben Sie es beim Erstellen der Anwendung an:

mvn package -Pnative

Interessanterweise kann die generierte Anwendung getestet werden. Dies ist wichtig, da sich die Ausführung von nativem Code von der Ausführung auf der JVM unterscheiden kann. Die Annotation @SubstrateTest führt plattformspezifischen Anwendungscode aus. Die Wiederverwendung vorhandener Testcodes kann durch Vererbung erfolgen; der Code zum Testen einer plattformabhängigen Anwendung sieht dann folgendermaßen aus:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Das generierte Image kann in Docker gepackt und in Kubernetes oder OpenShift ausgeführt werden, ausführlich beschrieben in Anleitung.

Werkzeuge

Das Quarkus-Framework kann mit Maven und Gradle verwendet werden. Maven wird im Gegensatz zu Gradle vollständig unterstützt. Leider unterstützt Gradle derzeit nicht das Erstellen eines leeren Projekts; detaillierte Informationen finden Sie auf der Website das Lehrbuch.

Extensions

Quarkus ist ein erweiterbares Framework. Derzeit liegt eine Bestellung vor 40 Erweiterungen, die verschiedene Funktionen hinzufügen – vom Support Feder-DI-Container и Apache Kamel bevor Sie Metriken für ausgeführte Dienste protokollieren und veröffentlichen. Und es gibt bereits eine Erweiterung, die neben Java auch das Schreiben von Anwendungen in Kotlin unterstützt.

Abschluss

Meiner Meinung nach liegt Quarkus durchaus im Trend der Zeit. Die Backend-Codeentwicklung wird immer einfacher, und dieses Framework vereinfacht und beschleunigt die Serviceentwicklung weiter, indem es native Unterstützung für Docker und Kubernetes hinzufügt. Ein großes Plus ist die integrierte Unterstützung für GraalVM und die Generierung plattformabhängiger Images, wodurch Dienste sehr schnell gestartet werden können und wenig Speicherplatz beanspruchen. Und das ist in unserer Zeit der Massenbegeisterung für Microservices und serverlose Architektur sehr wichtig.

Offiziellen Website - quarkus.io. Beispielprojekte für den schnellen Einstieg finden Sie bereits auf GitHub.

Source: habr.com

Kommentar hinzufügen