
Uvod
Sedmog ožujka tvrtka RedHat (uskoro — IBM) novi okvir — . Prema riječima developera, ovaj okvir temelji se na GraalVM i OpenJDK HotSpot te je namijenjen Kubernetesu. Quarkus stack uključuje: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus i druge.
Cilj stvaranja — učiniti Javu vodećom platformom za implementaciju u Kubernetes i razvoj serverless aplikacija, pružajući developerima jedinstven pristup razvoju kako u reaktivnom, tako i u imperativnom stilu.
Ako pogledamo klasifikaciju okvira, Quarkus se nalazi negdje između "Agregatora/Koder Generatori" i "Visokorazinskih fullstack okvira". To je već više od agregatora, ali ne dostiže full-stack, jer je usmjeren na razvoj backend-a.
Obećana je vrlo visoka brzina pokretanja aplikacije i malo potrošnje memorije. Evo podataka s web stranice developera:
Vrijeme od pokretanja do prvog odgovora (s):
Konfiguracija
REST
REST+JPA
Quarkus+GraalVM
0.014
0.055
Quarkus+OpenJDK
0.75
2.5
Tradicionalni Cloud Native Stack*
4.3
9.5
Potrošnja memorije (Mb):
Konfiguracija
REST
REST+JPA
Quarkus+GraalVM
13
35
Quarkus+OpenJDK
74
130
Tradicionalni Cloud Native Stack*
140
218
Impresivno, zar ne?
*Informacije o ovom stacku tehnologija nisam našao, može se pretpostaviti da je to neka vrsta Spring Boota s dodatnim kompenzacijama.
Hello World!
Najjednostavnija aplikacija napisana na Quarkusu izgledat će ovako:
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
}To je doslovno jedna klasa i to je dovoljno! Aplikaciju možemo pokrenuti putem Maven-a u razvojnom načinu:
mvn compile quarkus:dev
…
$ curl http://localhost:8080/hello
helloRazlika u odnosu na običnu aplikaciju je što nema klase Application! Quarkus podržava hot reload, tako da se aplikacija može mijenjati bez ponovnog pokretanja, čime razvoj postaje još brži.
Što dalje? Možemo dodati servis u kontroler pomoću anotacije . Kod servisa:
@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!Primijetite da Quarkus koristi standardne anotacije iz poznatih okvira — CDI i JAX-RS. Ništa novo ne morate učiti, ako ste već radili s CDI i JAX-RS, naravno.
Rad s bazom podataka
Koristi se Hibernate i standardne JPA anotacije za entitete. Kao i kod REST kontrolera, potrebno je napisati minimalno koda. Dovoljno je navesti ovisnosti u datoteci za izgradnju, dodati anotacije. @Entity i konfigurirati datasource u application.properties.
Sve. Nema sessionFactory, persistence.xml i drugih servisnih datoteka. Pišemo samo onaj kod koji je potreban. Međutim, ako je potrebno, može se stvoriti datoteka persistence.xml i detaljnije konfigurirati ORM sloj.
Quarkus podržava keširanje entiteta, kolekcija za odnose jedan-prema-mnogo, kao i upita. Na prvi pogled, izgleda odlično, ali to je lokalno keširanje, za jedan čvor Kubernetes-a. Tj. keševi različitih čvorova nisu međusobno usklađeni. Nadam se da je to privremeno.
Asinkrono izvršavanje koda
Kao što je spomenuto ranije, Quarkus podržava i reaktivni stil programiranja. Kod prethodne aplikacije može se zapisati u drugom obliku.
@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 + "!";
});
}
}Asinkroni kod također se može premjestiti u servis, rezultat će biti isti.
Testiranje
Testove za Quarkus aplikacije moguće je pisati u JUnit4 ili JUnit5. Ispod je primjer testa za endpoint, napisan je uz pomoć RestAssured, ali može se koristiti i drugi okvir:
@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 + "!"));
}
}Anotacija @QuarkusTest propisuje pokretanje aplikacije prije pokretanja testova. U ostalom — poznati kod svim programerima.
Platformno zavisna aplikacija
Budući da je Quarkus čvrsto integriran s GraalVM-om, moguće je generirati platformno zavistan kod. Za to je potrebno instalirati GraalVM i postaviti varijablu okruženja GRAALVM_HOME. Zatim i odrediti ga prilikom izgradnje aplikacije:
mvn package -PnativeZanimljivo je da generiranu aplikaciju možete testirati. To je važno, jer izvršavanje "nativnog" koda može varirati od izvršavanja na JVM-u. Anotacija @SubstrateTest pokreće platformno ovisni kod aplikacije. Ponovno korištenje postojećeg koda testova može se ostvariti pomoću nasljeđivanja, pa će kod za testiranje platformno ovisne aplikacije izgledati ovako:
@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {
}Generirani imidž može se zapakirati u Docker i pokretati u Kubernetesu ili OpenShiftu, detaljno opisano u .
Alat za rad
Okvir Quarkus može se koristiti s Mavenom i Gradleom. Maven se u potpunosti podržava, za razliku od Gradlea. Nažalost, trenutno Gradle ne podržava generiranje praznog projekta, na web stranici možete pronaći detaljan .
Ekstenzije
Quarkus je proširiv okvir. Trenutno postoji otprilike , koja dodaju raznoliku funkcionalnost — od podrške za i do logiranja i objavljivanja metrika za radne usluge. Već postoji proširenje za podršku pisanju aplikacija na jeziku Kotlin, uz Javu.
Zaključak
Po mom mišljenju, Quarkus se savršeno uklapa u trenutne trendove. Razvoj backend koda postaje sve jednostavniji, a ovaj okvir dodatno pojednostavljuje i ubrzava razvoj usluga, dodajući "nativnu" podršku za Docker i Kubernetes. Ogromna prednost je ugrađena podrška za GraalVM i generaciju platformno ovisnih imidža, što omogućava stvaranje usluga koje se brzo pokreću i zauzimaju malo memorije. A to je veoma važno u današnje vrijeme masovnog interesa za mikroservisima i serverless arhitekturom.
Službena stranica — . Primjeri projekata za brzi start već su dostupni na .
Izvor: habr.com
