Quarkus — supersonična subatomska Java. Kratak pregled frameworka

Quarkus — supersonična subatomska Java. Kratak pregled frameworka

Uvod

Sedmog ožujka tvrtka RedHat (uskoro — IBM) predstavila novi okvir — Quarkus. 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 ovu 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
hello

Razlika 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 Inject. 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 navesti profil za izgradnju i odrediti ga prilikom izgradnje aplikacije:

mvn package -Pnative

Zanimljivo 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 uputi.

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 vodič.

Ekstenzije

Quarkus je proširiv okvir. Trenutno postoji otprilike 40 proširenja, koja dodaju raznoliku funkcionalnost — od podrške za Spring DI kontejner i Apache Camel 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 — quarkus.io. Primjeri projekata za brzi start već su dostupni na GitHub.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster