Quarkus — nadzvuková subatomová Java. Stručný přehled frameworku

Quarkus — nadzvuková subatomová Java. Stručný přehled frameworku

Úvod

Sedmého března společnost RedHat (brzy — IBM) představila nový rámec — Quarkus. Podle slov vývojářů je tento rámec založen na GraalVM a OpenJDK HotSpot a je určen pro Kubernetes. Tech stack Quarkus zahrnuje: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus a další.

Cílem vytvoření je učinit Java vedoucí platformou pro nasazení v Kubernetes a vývoj serverless aplikací, poskytující vývojářům sjednocený přístup k vývoji jak v reaktivním, tak v imperativním stylu.

Pokud se podíváme na tento kategorizaci rámců, Quarkus se nachází někde mezi „Aggregátory/Generátory kódu“ a „High-level fullstack frameworky“. Je to více než agregátor, ale ani to nedosahuje full-stack, protože je zaměřen na vývoj backendu.

Byla slíbena velmi vysoká rychlost spuštění aplikace a nízká spotřeba paměti. Zde jsou údaje ze stránek vývojáře:

Doba od startu do první odpovědi (s):

Konfigurace
REST
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Tradiční cloudová nativní stack*
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í stack*
140
218

Impozantní, že?

*Informace o tomto technickém stacku jsem nenašel, můžeme předpokládat, že to je nějaký Spring Boot s dodatečným vybavením..

Hello World!

Nejjednodušší aplikace napsaná na Quarkus bude vypadat takto:

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

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

To je doslova jedna třída a to je vše! Aplikaci můžeme spustit pomocí Maven v režimu vývoje:

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

Rozdíl oproti běžné aplikaci — chybí třída Application! Quarkus podporuje hot reload, takže lze měnit aplikaci, aniž by se restartovala, což urychluje vývoj.

Co dál? Můžeme přidat službu do kontroleru pomocí anotace Injekce. Kód služby:

@ApplicationScoped
public class GreetingService {

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

Kontroler:

@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 v Quarkus se používají standardní anotace z známých rámců — CDI a JAX-RS. Není třeba se učit nic nového, pokud jste s CDI a JAX-RS pracovali dříve.

Práce s databází

Používá se Hibernate a standardní JPA anotace pro entity. Jak bylo uvedeno u REST kontrolerů, je třeba napsat minimální množství kódu. Stačí uvést závislosti v souboru pro sestavení a přidat anotace. @Entity a nastavit datasource v application.properties.

To je vše. Žádné sessionFactory, persistence.xml a další servisní soubory. Píšeme pouze ten kód, který je potřeba. Pokud je to však nutné, lze vytvořit soubor persistence.xml a podrobněji konfigurovat ORM vrstvu.

Quarkus podporuje kešování entit, kolekcí pro vztahy jeden-k-mnohým, stejně jako dotazy. Na první pohled to vypadá skvěle, ale je to lokální kešování pro jeden uzel Kubernetes. Tedy keše různých uzlů nejsou vzájemně synchronizovány. Doufám, že je to dočasné.

Asynchronní vykonávání kódu

Jak bylo zmíněno výše, Quarkus podporuje i reaktivní styl programování. Kód předchozí aplikace lze napsat jiným způsobem.

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

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   @Path("/{name}")
   public CompletionStage greeting(@PathParam("name") String name) {
       return CompletableFuture.supplyAsync(() -> {
           return "Hello " + name + "!";
       });
   }
}

Asynchronní kód lze také přesunout do služby, výsledek bude stejný.

Testování

Testy pro aplikace Quarkus lze psát na JUnit4 nebo JUnit5. Níže je uveden příklad testu pro endpoint, který je napsán pomocí RestAssured, ale lze použít i jiný framework:

@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 předepisuje spuštění aplikace před tím, než se spustí testy. Jinak jde o kód známý všem vývojářům.

Platformně závislá aplikace

Jelikož je Quarkus těsně integrován s GraalVM, lze samozřejmě generovat platformně závislý kód. K tomu je třeba nainstalovat GraalVM a nastavit proměnnou prostředí GRAALVM_HOME. Dále je třeba zapsat profil pro sestavení a uvést jej při sestavení aplikace:

mvn package -Pnative

Co je zajímavé, generovanou aplikaci lze otestovat. A to je důležité, protože vykonávání 'nativního' kódu se může lišit od vykonávání na JVM. Anotace @SubstrateTest spouští platformně závislý kód aplikace. Znovupoužití existujícího kódu testů lze provést pomocí dědičnosti, výsledkem čehož kód pro testování platformně závislé aplikace vypadá takto:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Generovaný obraz lze zabalit do Dockeru a spouštět v Kubernetes nebo OpenShift, podrobnosti jsou uvedeny v instrukci.

Nástroje

Framework Quarkus lze používat s Maven a Gradle. Maven je plně podporován, na rozdíl od Gradle. Bohužel, v současné době Gradle nepodporuje generování prázdného projektu, na webu jsou podrobné učebnice.

Rozšíření

Quarkus — rozšiřitelný framework. V současné době existuje přibližně 40 rozšíření, která přidávají různou funkcionalitu — od podpory Spring DI kontejneru a Apache Camel až po protokolování a publikaci metrik pro běžící služby. A již existuje rozšíření pro podporu psaní aplikací v jazyce Kotlin, kromě Javy.

Závěr

Podle mého názoru je Quarkus rozhodně v trendech doby. Vývoj backendového kódu se stává stále jednodušším, a tento framework ještě více zjednodušuje a zrychluje vývoj služeb, přičemž přidává 'nativní' podporu pro Docker a Kubernetes. Obrovský plus — integrovaná podpora GraalVM a generování platformně závislých obrazů, což umožňuje, aby byly služby skutečně rychle startující a zabíraly málo místa v paměti. A to je v naší době masového zaměření na mikroslužby a serverless architekturu velmi důležité.

Oficiální webová stránka — quarkus.io. Příklady projektů pro rychlý start již existují na GitHub.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster