Quarkus je nadzvuková subatomárna Java. Stručný prehľad rámca

Quarkus je nadzvuková subatomárna Java. Stručný prehľad rámca

Úvod

XNUMX. marca RedHat (čoskoro IBM) представила nový rámec - kvarkus. Podľa vývojárov je tento framework založený na GraalVM a OpenJDK HotSpot a je určený pre Kubernetes. Zásobník Quarkus obsahuje: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus a ďalšie.

Cieľom je urobiť z Java poprednú platformu pre nasadenie Kubernetes a vývoj aplikácií bez servera, čo vývojárom poskytne jednotný prístup k vývoju v reaktívnom aj imperatívnom štýle.

Ak sa pozriete na toto klasifikáciu rámcov, potom je Quarkus niekde medzi „agregátormi/generátormi kódu“ a „vysokoúrovňovými fullstack frameworkami“. Toto je už viac ako len agregátor, ale nedosahuje ani úplný zásobník, pretože... prispôsobené pre vývoj backendu.

Sľubovaná je veľmi vysoká rýchlosť spúšťania aplikácií a nízka spotreba pamäte. Tu sú údaje z webovej stránky vývojára:

Čas od začiatku po prvú odpoveď (odpovede):

konfigurácia
REST
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Tradičný cloudový natívny zásobník*
4.3
9.5

Spotreba pamäte (Mb):

konfigurácia
REST
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Tradičný cloudový natívny zásobník*
140
218

Pôsobivé, však?

*Nenašiel som žiadne informácie o tomto technologickom balíku, môžeme predpokladať, že ide o nejaký druh Spring Boot s dodatočnou súpravou karosérie.

Ahoj svet!

Najjednoduchšia aplikácia napísaná v Quarkus by vyzerala takto:

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

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

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

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

Rozdiel oproti bežnej aplikácii je v tom, že neexistuje trieda aplikácií! Quarkus podporuje rýchle opätovné načítanie, takže svoju aplikáciu môžete zmeniť bez jej reštartovania, vďaka čomu je vývoj ešte rýchlejší.

Čo bude ďalej? Službu môžete do ovládača pridať pomocou anotácie Injekciu. Servisný kód:

@ApplicationScoped
public class GreetingService {

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

Ovládač:

@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 Quarkus používa štandardné anotácie zo známych rámcov - CDI a JAX-RS. Nie je potrebné sa učiť nič nové, ak ste už s CDI a JAX-RS pracovali, samozrejme.

Práca s databázou

Používajú sa anotácie hibernácie a štandardné anotácie JPA pre entity. Rovnako ako v prípade ovládačov REST musíte napísať minimum kódu. Stačí uviesť závislosti v súbore zostavy, pridať anotácie @Entity a nakonfigurovať zdroj údajov v application.properties.

Všetky. Žiadne súbory sessionFactory, persistence.xml alebo iné súbory služieb. Píšeme len kód, ktorý je potrebný. V prípade potreby však môžete vytvoriť súbor persistence.xml a jemnejšie nakonfigurovať vrstvu ORM.

Quarkus podporuje ukladanie entít do vyrovnávacej pamäte, kolekcie pre vzťahy typu one-to-many a dotazy. Na prvý pohľad to vyzerá super, ale je to tak miestne ukladanie do vyrovnávacej pamäte pre jeden uzol Kubernetes. Tie. Vyrovnávacie pamäte rôznych uzlov nie sú navzájom synchronizované. Dúfam, že je to dočasné.

Asynchrónne vykonávanie kódu

Ako už bolo spomenuté vyššie, Quarkus podporuje aj reaktívny štýl programovania. Kód predchádzajúcej aplikácie môže byť napísaný v inej forme.

@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 je možné preniesť aj asynchrónny kód, výsledok bude rovnaký.

Testovanie

Testy pre aplikácie Quarkus môžu byť napísané v JUnit4 alebo JUnit5. Nižšie je uvedený príklad testu pre koncový bod, je 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 vám dáva pokyn na spustenie aplikácie pred spustením testov. Zvyšok je kód známy všetkým vývojárom.

Aplikácia špecifická pre platformu

Keďže Quarkus je úzko integrovaný s GraalVM, je samozrejme možné generovať kód špecifický pre platformu. Ak to chcete urobiť, musíte nainštalovať GraalVM a zadať premennú prostredia GRAALVM_HOME. Ďalej zaregistrujte profil na montáž a špecifikujte ho pri zostavovaní aplikácie:

mvn package -Pnative

Zaujímavosťou 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. Anotácia @SubstrateTest spúšťa kód aplikácie špecifický pre platformu. Opätovné použitie existujúceho testovacieho kódu je možné vykonať pomocou dedičnosti; v dôsledku toho bude kód na testovanie aplikácie závislej od platformy vyzerať takto:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Vygenerovaný obrázok je možné zabaliť do Dockera a spustiť v Kubernetes alebo OpenShift, podrobne popísaných v inštrukcie.

náradie

Rámec Quarkus je možné použiť s Maven a Gradle. Maven je plne podporovaný, na rozdiel od Gradle. Žiaľ, momentálne Gradle nepodporuje generovanie prázdneho projektu, podrobné informácie sú na webovej stránke učebnice.

expanzia

Quarkus je rozšíriteľný rámec. V súčasnosti existuje objednávka 40 nadstavcov, ktoré pridávajú rôzne funkcie – od podpory Pružinový DI kontajner и Apache Camel pred zaznamenávaním a publikovaním metrík pre spustenie služieb. A už existuje rozšírenie na podporu písania aplikácií v Kotline okrem Javy.

Záver

Quarkus je podľa mňa celkom v súlade s dobovými trendmi. Vývoj backendového kódu je čoraz jednoduchší a tento rámec ďalej zjednodušuje a urýchľuje vývoj služieb pridaním natívnej podpory pre Docker a Kubernetes. Obrovským plusom je vstavaná podpora pre GraalVM a generovanie obrazov závislých od platformy, čo umožňuje, aby sa služby spúšťali naozaj rýchlo a zaberali málo miesta v pamäti. A to je veľmi dôležité v našej dobe masovej vášne pre mikroslužby a architektúru bez serverov.

Oficiálna stránka - quarkus.io. Príklady projektov pre rýchly štart sú už dostupné na GitHub.

Zdroj: hab.com

Pridať komentár