
Úvod
Sedmého března společnost RedHat (brzy — IBM) nový rámec — . 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 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
helloRozdí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 . 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 a uvést jej při sestavení aplikace:
mvn package -PnativeCo 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 .
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é .
Rozšíření
Quarkus — rozšiřitelný framework. V současné době existuje přibližně , která přidávají různou funkcionalitu — od podpory a 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 — . Příklady projektů pro rychlý start již existují na .
Zdroj: habr.com
