Quarkus — nadzvuková subatomárna Java. Krátky prehľad frameworku

Quarkus — nadzvuková subatomárna Java. Krátky prehľad frameworku

Úvod

Dňa 7. marca spoločnosť RedHat (on čoskoro — IBM) predstavila nový framework — Quarkus. Podľa slov vývojárov je tento framework založený na GraalVM a OpenJDK HotSpot a je určený pre Kubernetes. Stack Quarkus obsahuje: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus a ďalšie.

Cieľom vytvorenia je urobiť z Java poprednú platformu pre nasadenie v Kubernetes a vývoj serverless aplikácií, poskytujúc vývojárom jednotný prístup k vývoju ako v reaktívnom, tak aj v imperatívnom štýle.

Ak sa pozrieme na túto kategorizáciu frameworkov, Quarkus je niekde medzi „Aggregátormi/Kódom generátormi“ a „Vysokou úrovňou fullstack frameworkami“. Je to už viac ako agregátor, ale ani sa to nedotýka full-stack, pretože je zamerané na vývoj backendu.

Sľubuje sa veľmi vysoká rýchlosť spustenia aplikácie a nízka spotreba pamäte. Tu sú údaje zo stránky vývojárov:

Čas od spustenia po prvú odpoveď (s):

Konfigurácia
REST
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Tradičný cloud native stack*
4.3
9.5

Spotreba pamäte (Mb):

Konfigurácia
REST
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Tradičný cloud native stack*
140
218

Pôsobivé, však?

*Informácie o tomto stacku technológií som nenašiel, možno predpokladať, že ide o nejaký Spring Boot s doplnkovou výbavou.

Hello World!

Najjednoduchšia aplikácia napísaná na Quarkus bude vyzerať takto:

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

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

Je to v podstate jedna trieda a to stačí! Aplikáciu môžete spustiť pomocou Maven v režime vývoja:

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

Rozdiel od bežnej aplikácie — žiadna trieda Application! Quarkus podporuje hot reload, takže môžete zmeniť aplikáciu bez reštartovania, čím sa vývoj stáva ešte rýchlejším.

Čo ďalej? Môžete pridať službu do kontroléra pomocou anotácie Inject. Kód služby:

@ApplicationScoped
public class GreetingService {

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

Kontrolér:

@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šimnite si, že v Quarkus sú použité štandardné anotácie z známych frameworkov — CDI a JAX-RS. Nič nové sa nemusíte učiť, ak ste predtým pracovali s CDI a JAX-RS.

Práca s databázou

Používa sa Hibernate a štandardné JPA anotácie pre entity. Rovnako ako v prípade REST kontrolérov je potrebné napísať minimálne množstvo kódu. Stačí uviesť závislosti v súboru na zostavenie a pridať anotácie. @Entity a nakonfigurovať datasource v application.properties.

Všetko. Žiadne sessionFactory, persistence.xml a iné servisné súbory. Píšeme iba ten kód, ktorý je potrebný. Avšak, ak je to potrebné, môžeme vytvoriť súbor persistence.xml a podrobnejšie nakonfigurovať ORM vrstvu.

Quarkus podporuje cachovanie entít, kolekcií pre vzťahy jeden-k-mnohým, ako aj dopytov. Na prvý pohľad to vyzerá skvele, ale to lokálne cachovanie, pre jeden uzol Kubernetes. T.j. cache rôznych uzlov nie sú medzi sebou synchronizované. Dúfam, že je to dočasné.

Asynchrónne vykonávanie kódu

Ako bolo uvedené vyššie, Quarkus podporuje aj reaktívny štýl programovania. Kód predchádzajúcej aplikácie možno zapísať iným spôsobom.

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

Asynchrónny kód je možné presunúť aj do služby, výsledok bude rovnaký.

Testovanie

Testy pre Quarkus aplikácie možno písať v JUnit4 alebo JUnit5. Nižšie je uvedený príklad testu pre endpoint, bol napísaný pomocou RestAssured, ale možno použiť aj iný 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 + "!"));
   }
}

Anotácia @QuarkusTest predpisuje spustiť aplikáciu predtým, ako sa spustia testy. Inak ide o kód známy všetkým vývojárom.

Platformovo závislá aplikácia

Keďže je Quarkus úzko integrovaný s GraalVM, určite je možné generovať platformovo závislý kód. Na to je potrebné nainštalovať GraalVM a nastaviť premennú prostredia GRAALVM_HOME. Potom napísať profil pre zostavenie a uviesť ho pri zostavení aplikácie:

mvn package -Pnative

Zaujímavé je, že vygenerovanú aplikáciu je možné otestovať. A to je dôležité, pretože vykonávanie „natívneho“ kódu sa môže líšiť od vykonávania na JVM. Annotation @SubstrateTest spúšťa platformovo závislý kód aplikácie. Znovupoužitie existujúceho testovacieho kódu je možné pomocou dedenia, výsledný kód pre testovanie platformovo závislej aplikácie bude vyzerať takto:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Vygenerovaný obraz je možné zabaliť do Dockeru a spúšťať v Kubernetes alebo OpenShift, podrobnosti sú opísané v the instructions.

Nástroj

Rámec Quarkus je možné používať s Maven a Gradle. Maven sa plne podporuje, na rozdiel od Gradle. Našťastie, v súčasnosti Gradle nepodporuje generovanie prázdneho projektu, na stránke sú podrobné návody.

Rozšírenia

Quarkus je rozšíriteľný rámec. V súčasnosti existuje približne 40 rozšírení, ktoré pridávajú rôznu funkcionalitu – od podpory kontajnera Spring DI a Apache Camel až po logovanie a publikovanie metrík pre bežiace služby. A už existuje rozšírenie na podporu písania aplikácií v jazyku Kotlin, okrem Javy.

Záver

Podľa môjho názoru je Quarkus určite v súlade s trendmi doby. Vývoj backendového kódu sa stáva čoraz jednoduchším a tento rámec ešte viac zjednodušuje a urýchľuje vývoj služieb, pričom pridáva „natívnu“ podporu Dockeru a Kubernetes. Obrovským plusom je zabudovaná podpora GraalVM a generovania platformovo závislých obrazov, čo umožňuje vytvárať služby, ktoré rýchlo štartujú a zaberajú málo miesta v pamäti. A to je v čase masového záujmu o mikroslužby a serverles architektúru veľmi dôležité.

Oficiálna webová stránka – quarkus.io. Príklady projektov na rýchly štart sú už k dispozícii na GitHub.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster