
Bevezetés
Március 7-én a RedHat (hamarosan az IBM) bejelentette új keretrendszer — . 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 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
helloA 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 . 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 és meg kell adni a build során az alkalmazásnál:
mvn package -PnativeAmi é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 .
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 .
Bővítmények
A Quarkus egy bővíthető keretrendszer. Jelenleg körülbelül , amelyek különféle funkcionalitásokat adnak hozzá – a támogatástól kezdve és 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 — . Gyors indulásra már vannak projektek példái a .
Forrás: habr.com
