Quarkus je nadzvočna subatomska Java. Kratek pregled ogrodja

Quarkus je nadzvočna subatomska Java. Kratek pregled ogrodja

Predstavitev

XNUMX. marca RedHat (kmalu IBM) predstavljeno nov okvir - quarkus. Po besedah ​​razvijalcev to ogrodje temelji na GraalVM in OpenJDK HotSpot in je zasnovano za Kubernetes. Sklad Quarkus vključuje: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus in druge.

Cilj je, da Java postane vodilna platforma za uvajanje Kubernetes in razvoj aplikacij brez strežnikov, ki razvijalcem zagotavlja enoten pristop k razvoju tako v reaktivnem kot v imperativnem slogu.

Če pogledate to klasifikaciji ogrodij, potem je Quarkus nekje med »agregatorji/generatorji kode« in »ogrodji polnega sklada na visoki ravni«. To je že več kot agregator, vendar ne doseže niti polnega sklada, ker ... prilagojen za backend razvoj.

Obeta se zelo visoka hitrost zagona aplikacij in majhna poraba pomnilnika. Tukaj so podatki s spletnega mesta razvijalca:

Čas od začetka do prvega odgovora (s):

Konfiguracija
REST
OSTALO+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Tradicionalni izvorni sklad v oblaku*
4.3
9.5

Poraba pomnilnika (Mb):

Konfiguracija
REST
OSTALO+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Tradicionalni izvorni sklad v oblaku*
140
218

Impresivno, kajne?

*Nisem našel nobenih informacij o tem tehnološkem nizu, lahko domnevamo, da je to nekakšen Spring Boot z dodatnim kompletom za telo.

Pozdravljen, svet!

Najenostavnejša aplikacija, napisana v Quarkusu, bi izgledala takole:

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

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

To je dobesedno en razred in to je dovolj! Aplikacijo lahko zaženete z Mavenom v razvojnem načinu:

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

Razlika od navadne aplikacije je v tem, da ni razreda aplikacije! Quarkus podpira vroče ponovno nalaganje, tako da lahko spremenite svojo aplikacijo, ne da bi jo znova zagnali, zaradi česar je razvoj še hitrejši.

Kaj je naslednje? Krmilniku lahko dodate storitev z opombo Vbrizgajte. Koda storitve:

@ApplicationScoped
public class GreetingService {

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

krmilnik:

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

Upoštevajte, da Quarkus uporablja standardne opombe iz znanih ogrodij - CDI in JAX-RS. Seveda se ni treba naučiti ničesar novega, če ste že delali s CDI in JAX-RS.

Delo z bazo podatkov

Uporabljajo se Hibernate in standardne opombe JPA za entitete. Tako kot pri krmilnikih REST morate napisati najmanj kode. Dovolj je, da navedete odvisnosti v zbirni datoteki, dodate opombe @Entity in konfigurirajte vir podatkov v application.properties.

Vse. Brez sessionFactory, persistence.xml ali drugih servisnih datotek. Napišemo samo kodo, ki je potrebna. Vendar pa lahko po potrebi ustvarite datoteko persistence.xml in natančneje konfigurirate plast ORM.

Quarkus podpira predpomnjenje entitet, zbirk za relacije ena proti mnogo in poizvedb. Na prvi pogled izgleda super, a je lokalno predpomnjenje, za eno vozlišče Kubernetes. Tisti. Predpomnilniki različnih vozlišč med seboj niso sinhronizirani. Upam, da je to začasno.

Asinhrono izvajanje kode

Kot že omenjeno, Quarkus podpira tudi reaktivni stil programiranja. Kodo prejšnje aplikacije je mogoče zapisati v drugačni obliki.

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

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   @Path("/{name}")
   public CompletionStage<String> greeting(@PathParam("name") String name) {
       return CompletableFuture.supplyAsync(() -> {
           return "Hello " + name + "!";
       });
   }
}

Asinhrono kodo lahko prenesete tudi v storitev, rezultat bo enak.

Testiranje

Teste za aplikacije Quarkus lahko napišete v JUnit4 ali JUnit5. Spodaj je primer testa za končno točko, napisan je z uporabo RestAssured, vendar je mogoče uporabiti drugo ogrodje:

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

Opomba @QuarkusTest vam naroči, da zaženete aplikacijo pred izvajanjem testov. Ostalo je koda, poznana vsem razvijalcem.

Aplikacija, specifična za platformo

Ker je Quarkus tesno povezan z GraalVM, je seveda mogoče ustvariti kodo, specifično za platformo. Če želite to narediti, morate namestiti GraalVM in določiti spremenljivko okolja GRAALVM_HOME. Nadalje registrirajte profil za montažo in ga določite pri gradnji aplikacije:

mvn package -Pnative

Zanimivo je, da je ustvarjeno aplikacijo mogoče preizkusiti. In to je pomembno, ker se lahko izvajanje izvorne kode razlikuje od izvajanja na JVM. Opomba @SubstrateTest izvaja kodo aplikacije, specifično za platformo. Ponovna uporaba obstoječe preskusne kode se lahko izvede z uporabo dedovanja; posledično bo koda za testiranje aplikacije, odvisne od platforme, videti takole:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Ustvarjeno sliko je mogoče zapakirati v Docker in izvajati v Kubernetes ali OpenShift, ki je podrobno opisan v Navodila.

Orodje

Ogrodje Quarkus se lahko uporablja z Maven in Gradle. Maven je popolnoma podprt, za razliko od Gradle. Gradle trenutno žal ne podpira generiranja praznega projekta, podrobne informacije so na spletni strani učbenik.

Podaljški

Quarkus je razširljiv okvir. Trenutno obstaja naročilo 40 podaljškov, ki dodajajo različne funkcionalnosti – od podpore Vzmetna DI posoda и Apaška kamela pred beleženjem in objavo meritev za izvajajoče se storitve. In že obstaja razširitev za podporo pisanja aplikacij v Kotlinu, poleg Jave.

Zaključek

Po mojem mnenju je Quarkus kar v skladu s trendi tega časa. Razvoj zaledne kode postaja vse lažji in ta okvir dodatno poenostavi in ​​pospeši razvoj storitev z dodajanjem izvorne podpore za Docker in Kubernetes. Velik plus je vgrajena podpora za GraalVM in generiranje slik, odvisnih od platforme, kar omogoča, da se storitve zaženejo zelo hitro in zavzamejo malo pomnilniškega prostora. In to je zelo pomembno v našem času množične strasti do mikrostoritev in brezstrežniške arhitekture.

Uradna stran - quarkus.io. Primeri projektov za hiter začetek so že na voljo na GitHub.

Vir: www.habr.com

Dodaj komentar