A Quarkus — szuperszonikus szubatomikus Java. A keretrendszer rövid áttekintése

A Quarkus — szuperszonikus szubatomikus Java. A keretrendszer rövid áttekintése

Bevezetés

Március 7-én a RedHat (hamarosan az IBM) bejelentette bemutatta új keretrendszer — Quarkus. A fejlesztők szerint ez a keretrendszer a GraalVM és az OpenJDK HotSpot alapjaira épül, és a Kuberneteshez lett kifejlesztve. A Quarkus stack az alábbiakat tartalmazza: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus és mások.

A létrehozás célja, hogy a Java vezető platformmá váljon a Kubernetesben történő telepítés és a serverless alkalmazások fejlesztése terén, egységes megközelítést biztosítva a fejlesztőknek a reaktív és imperatív stílusú fejlesztéshez.

Ha a erre keretrendszerek osztályozására nézünk, a Quarkus valahol az "Aggregátorok/Kódgenerátorok" és a "Magas szintű teljes stack keretrendszerek" között helyezkedik el. Ez már több, mint egy aggregátor, de nem éri el a full-stack szintet, mivel a backend fejlesztésére lett optimalizálva.

Nagyon magas indítási sebességet és alacsony memóriafogyasztást ígérnek. Íme az adatok a fejlesztő weboldaláról:

Indítástól az első válaszig tartó idő (s):

Konfiguráció
REST
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Hagyományos Cloud Native Stack*
4.3
9.5

Memóriafogyasztás (Mb):

Konfiguráció
REST
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Hagyományos Cloud Native Stack*
140
218

Impozáns, nem igaz?

*Erről a technológiai stackről nem találtam információt, feltételezhető, hogy ez valami Spring Boot kiegészítőkkel..

Hello World!

A legegyszerűbb alkalmazás, amit Quarkus-on írnak, így fog kinézni:

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

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

Ez lényegében egy osztály, és ez elegendő! Az alkalmazás elindítható Maven segítségével fejlesztési módban:

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

A különbség a szokásos alkalmazáshoz képest az, hogy nincs Application osztály! A Quarkus támogatja a hot reload-ot, így módosíthatod az alkalmazást újraindítás nélkül, ezáltal a fejlesztés még gyorsabbá válik.

Mi a következő lépés? Szolgáltatás hozzáadása a vezérlőhöz az alábbi annotációval Inject. A szolgáltatás kódja:

@ApplicationScoped
public class GreetingService {

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

Controller:

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

Vegyük észre, hogy a Quarkus a megszokott keretrendszerekből, például a CDI és JAX-RS standard annotációit használja. Semmi újat nem kell tanulnod, ha korábban dolgoztál a CDI és JAX-RS használatával.

Adatbázissal való munka

A Hibernate és a standard JPA annotációk használatával történik az entitások esetében. Mint a REST vezérlők esetében, minimális kódot kell írni. Elég a függőségek megadására a build fájlban, valamint az annotációk elhelyezésére. @Entity és a datasource konfigurálására az application.properties fájlban.

Ennyi. Nincs sessionFactory, persistence.xml és egyéb szolgáltatói fájlok. Csak azt a kódot írjuk, amire szükség van. Ha szükséges, létrehozhatunk persistence.xml fájlt, és finomabb beállításokat végezhetünk az ORM rétegen.

A Quarkus támogatja az entitások, az egy-hoz-sok kapcsolatok gyűjteményeinek és a lekérdezések gyorsítótárazását. Első ránézésre nagyszerűen hangzik, de helyi gyorsítótárazás, egy Kubernetes csomópont esetében. Azaz, a különböző csomópontok gyorsítótárai nincsenek szinkronizálva egymással. Remélem, ez átmeneti.

Aszinkron kód végrehajtása

Ahogyan azt korábban említettem, a Quarkus támogatja a reaktív programozási stílust is. A korábbi alkalmazás kódját egy másik formában is meg lehet írni.

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

Az aszinkron kódot egy szolgáltatásba is áthelyezhetjük, az eredmény ugyanolyan lesz.

Tesztelés

A Quarkus alkalmazások tesztjeit írhatjuk JUnit4 vagy JUnit5 alatt. Az alábbiakban egy endpoint teszt példája található, amely a RestAssured-t használja, de egy másik keretrendszert is használhatunk:

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

@QuarkusTest annotáció megköveteli, hogy az alkalmazást indítsuk el a tesztek futtatása előtt. Ezen kívül – a fejlesztők számára jól ismert kód.

Platformfüggő alkalmazás

Mivel a Quarkus szorosan integrálódik a GraalVM-mel, természetesen lehet platformfüggő kódot generálni. Ehhez telepíteni kell a GraalVM-et, és meg kell határozni a GRAALVM_HOME környezeti változót. Ezután profilot kell definiálni a buildhez és meg kell adni a build során az alkalmazásnál:

mvn package -Pnative

Ami érdekes, a generált alkalmazás tesztelhető. Ez fontos, mivel a „natív” kód végrehajtása eltérhet a JVM-en végrehajtottól. Az @SubstrateTest annotáció platformfüggő alkalmazáskódot indít. A meglévő tesztkód újrahasználása öröklődés révén valósítható meg, végül a platformfüggő alkalmazás tesztelésére a kód így fog kinézni:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

A generált képet be lehet csomagolni Dockerbe és Kubernetesben vagy OpenShiftben futtatni, részletesen le van írva a utasítást.

Eszköztár

A Quarkus keretrendszer használható Maven és Gradle segítségével. A Maven teljes mértékben támogatott, míg a Gradle esetében sajnos jelenleg nem támogatja az üres projekt generálását, a weboldalon részletes útmutató.

Bővítmények

A Quarkus egy bővíthető keretrendszer. Jelenleg körülbelül 40 kiterjesztés, amelyek különféle funkcionalitásokat adnak hozzá – a támogatástól kezdve Spring DI konténer és Apache Camel a működő szolgáltatások loggolásáig és metrikák közzétételéig. Már létezik olyan kiterjesztés is, amely lehetővé teszi az alkalmazások írását Kotlin nyelven, Java mellett.

Zárás

Véleményem szerint a Quarkus abszolút trendben van. A backend kód fejlesztése egyre könnyebbé válik, és ez a keretrendszer még tovább egyszerűsíti és felgyorsítja a szolgáltatások fejlesztését, hozzáadva a „natív” Docker és Kubernetes támogatást. Óriási előny az integrált GraalVM támogatás és a platformfüggő képek generálása, ami lehetővé teszi, hogy a szolgáltatások valóban gyorsan induljanak és kevés helyet foglaljanak el a memóriában. Ez pedig nagyon fontos manapság, amikor a mikroszolgáltatások és a serverless architektúra iránti tömeges érdeklődés van.

Hivatalos weboldal — quarkus.io. Gyors indulásra már vannak projektek példái a GitHub.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster