Quarkus je nadzvuková subatomární Java. Stručný přehled rámce

Quarkus je nadzvuková subatomární Java. Stručný přehled rámce

úvod

XNUMX. března RedHat (brzy IBM) prezentovány nový rámec - kvarkus. Podle vývojářů je tento framework založen na GraalVM a OpenJDK HotSpot a je určen pro Kubernetes. Quarkus stack obsahuje: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus a další.

Cílem je učinit z Javy vedoucí platformu pro nasazení Kubernetes a vývoj aplikací bez serveru a poskytnout vývojářům jednotný přístup k vývoji v reaktivním i imperativním stylu.

Pokud se podíváte na tento klasifikaci frameworků, pak je Quarkus někde mezi „agregátory/generátory kódu“ a „vysokoúrovňové fullstack frameworky“. Toto je již více než jen agregátor, ale nedosahuje ani plného zásobníku, protože... na míru pro vývoj backendu.

Slibována je velmi vysoká rychlost spouštění aplikací a nízká spotřeba paměti. Zde jsou data z webu vývojáře:

Čas od začátku do první odpovědi (y):

Konfigurace
REST
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Tradiční cloudový nativní balíček*
4.3
9.5

Spotřeba paměti (Mb):

Konfigurace
REST
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Tradiční cloudový nativní balíček*
140
218

Působivé, že?

*Nenašel jsem žádné informace o tomto technologickém zásobníku, můžeme předpokládat, že se jedná o nějaký druh Spring Boot s přídavným body kitem.

Ahoj světe!

Nejjednodušší aplikace napsaná v Quarkusu by vypadala takto:

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

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

Je to doslova jedna třída a to stačí! Aplikaci můžete spustit pomocí Maven ve vývojovém režimu:

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

Rozdíl oproti běžné aplikaci je v tom, že neexistuje třída Aplikace! Quarkus podporuje horké znovu načtení, takže můžete svou aplikaci změnit, aniž byste ji restartovali, čímž je vývoj ještě rychlejší.

Co bude dál? Službu můžete do ovladače přidat pomocí anotace Vstřik. Servisní kód:

@ApplicationScoped
public class GreetingService {

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

Ovladač:

@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!

Všimněte si, že Quarkus používá standardní anotace ze známých frameworků - CDI a JAX-RS. Není třeba se učit nic nového, pokud jste s CDI a JAX-RS již pracovali, samozřejmě.

Práce s databází

Pro entity jsou použity hibernace a standardní anotace JPA. Stejně jako u REST ovladačů je potřeba napsat minimum kódu. Stačí v souboru sestavy uvést závislosti, přidat anotace @Entity a nakonfigurujte zdroj dat v application.properties.

Všechno. Žádné soubory sessionFactory, persistence.xml nebo jiné soubory služeb. Píšeme pouze kód, který je potřeba. V případě potřeby však můžete vytvořit soubor persistence.xml a nakonfigurovat vrstvu ORM jemněji.

Quarkus podporuje ukládání entit do mezipaměti, kolekce pro vztahy typu one-to-many a dotazy. Na první pohled to vypadá skvěle, ale je to tak místní ukládání do mezipaměti pro jeden uzel Kubernetes. Tito. Mezipaměti různých uzlů nejsou vzájemně synchronizovány. Doufám, že je to dočasné.

Asynchronní provádění kódu

Jak již bylo zmíněno výše, Quarkus také podporuje styl reaktivního programování. Kód předchozí aplikace může být zapsán v jiné podobě.

@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 + "!";
       });
   }
}

Do služby lze přenést i asynchronní kód, výsledek bude stejný.

Testování

Testy pro aplikace Quarkus lze psát v JUnit4 nebo JUnit5. Níže je uveden příklad testu pro koncový bod, je napsán pomocí RestAssured, ale lze použít i jiný rámec:

@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 + "!"));
   }
}

Anotace @QuarkusTest vám dává pokyn ke spuštění aplikace před spuštěním testů. Zbytek je kód známý všem vývojářům.

Aplikace specifická pro platformu

Vzhledem k tomu, že Quarkus je úzce integrován s GraalVM, je samozřejmě možné generovat kód specifický pro platformu. Chcete-li to provést, musíte nainstalovat GraalVM a zadat proměnnou prostředí GRAALVM_HOME. Dále zaregistrujte profil pro montáž a specifikujte jej při sestavování aplikace:

mvn package -Pnative

Zajímavé je, že vygenerovanou aplikaci lze testovat. A to je důležité, protože provádění nativního kódu se může lišit od provádění na JVM. Anotace @SubstrateTest spouští kód aplikace specifický pro platformu. Opětovné použití stávajícího testovacího kódu lze provést pomocí dědičnosti; v důsledku toho bude kód pro testování aplikace závislé na platformě vypadat takto:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Vygenerovaný obrázek lze zabalit do Dockeru a spustit v Kubernetes nebo OpenShift, podrobně popsáno v instrukce.

Sada nástrojů

Rámec Quarkus lze použít s Maven a Gradle. Maven je plně podporován, na rozdíl od Gradle. Bohužel v tuto chvíli Gradle nepodporuje generování prázdného projektu, podrobné informace jsou na webu učebnice.

Расширения

Quarkus je rozšiřitelný rámec. V současné době existuje objednávka 40 nástavců, které přidávají různé funkce - od podpory Pružinový DI kontejner и Apache Camel před protokolováním a publikováním metrik pro spouštění služeb. A už existuje rozšíření pro podporu psaní aplikací v Kotlinu, kromě Javy.

Závěr

Quarkus je podle mě docela v souladu s trendy doby. Vývoj backendového kódu je stále snazší a tento framework dále zjednodušuje a urychluje vývoj služeb přidáním nativní podpory pro Docker a Kubernetes. Obrovským plusem je vestavěná podpora pro GraalVM a generování obrazů závislých na platformě, díky čemuž se služby spouštějí opravdu rychle a zabírají málo místa v paměti. A to je velmi důležité v naší době masové vášně pro mikroslužby a bezserverovou architekturu.

Oficiální stránky - quarkus.io. Příklady projektů pro rychlý start jsou již k dispozici na GitHub.

Zdroj: www.habr.com

Přidat komentář