Quarkus on ülehelikiirusega subatomiline Java. Lühiülevaade raamistikust

Quarkus on ülehelikiirusega subatomiline Java. Lühiülevaade raamistikust

Sissejuhatus

XNUMX. märtsil RedHat (varsti IBM) esitatakse uus raamistik - Kvarkus. Arendajate sõnul põhineb see raamistik GraalVM-il ja OpenJDK HotSpotil ning on mõeldud Kubernetesi jaoks. Quarkuse pinu sisaldab: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus ja teised.

Eesmärk on muuta Java Kubernetese juurutamise ja serverivaba rakenduste arendamise juhtivaks platvormiks, pakkudes arendajatele ühtset lähenemist arendusele nii reaktiivsetes kui ka imperatiivsetes stiilides.

Vaatan see raamistike klassifikatsiooni, siis on Quarkus kusagil “Agregaatorite/koodigeneraatorite” ja “Kõrgetasemeliste täispinu raamistike” vahepeal. See on juba rohkem kui agregaator, kuid see ei jõua isegi täispinnini, sest... kohandatud taustaprogrammi arendamiseks.

Lubatakse väga suurt rakenduste käivitamise kiirust ja väikest mälukulu. Siin on andmed arendaja veebisaidilt:

Aeg algusest esimese vastuseni:

Konfiguratsioon
REST
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Traditsiooniline Cloud Native Stack*
4.3
9.5

Mälu tarbimine (Mb):

Konfiguratsioon
REST
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Traditsiooniline Cloud Native Stack*
140
218

Muljetavaldav, kas pole?

*Ma ei leidnud selle tehnoloogiapaki kohta teavet, võib eeldada, et see on mingi Spring Boot koos täiendava kehakomplektiga.

Tere, Maailm!

Lihtsaim Quarkuses kirjutatud rakendus näeks välja selline:

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

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

See on sõna otseses mõttes üks klass ja sellest piisab! Rakendust saate Maveni abil arendusrežiimis käivitada:

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

Erinevus tavarakendusest seisneb selles, et puudub Rakendusklass! Quarkus toetab kuuma taaslaadimist, nii et saate oma rakendust muuta ilma seda taaskäivitamata, muutes arenduse veelgi kiiremaks.

Mis järgmiseks? Saate lisada kontrollerile teenuse märkuse abil Süstige. Teenuse kood:

@ApplicationScoped
public class GreetingService {

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

Kontroller:

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

Pange tähele, et Quarkus kasutab standardseid märkusi tuttavatest raamistikest - CDI ja JAX-RS. Muidugi pole vaja midagi uut õppida, kui olete varem töötanud CDI ja JAX-RS-iga.

Töö andmebaasiga

Olemite jaoks kasutatakse talveunerežiimi ja standardseid JPA märkusi. Nagu REST-kontrollerite puhul, peate kirjutama minimaalselt koodi. Piisab, kui märkida koostefailis sõltuvused, lisada märkused @Entity ja konfigureerige andmeallikas rakenduses application.properties.

Kõik. Ei mingeid sessionFactory, persistence.xml ega muid teenusefaile. Kirjutame ainult vajaliku koodi. Vajadusel saab aga luua faili persistence.xml ja ORM-i kihti täpsemalt seadistada.

Quarkus toetab olemite vahemällu salvestamist, üks-mitmele suhete kogusid ja päringuid. Esmapilgul tundub see suurepärane, kuid nii see on kohalik vahemällu salvestamine ühe Kubernetese sõlme jaoks. Need. Erinevate sõlmede vahemälud ei ole omavahel sünkroonitud. Loodan, et see on ajutine.

Asünkroonse koodi täitmine

Nagu eespool mainitud, toetab Quarkus ka reaktiivset programmeerimisstiili. Eelmise taotluse koodi saab kirjutada erineval kujul.

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

Asünkroonset koodi saab ka teenusesse üle kanda, tulemus on sama.

Katsetamine

Quarkuse rakenduste teste saab kirjutada JUnit4-s või JUnit5-s. Allpool on näidiskatse lõpp-punkti jaoks, see on kirjutatud RestAssurediga, kuid kasutada saab ka teist raamistikku:

@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 märkus juhendab rakendust enne testide käivitamist käivitama. Ülejäänu on kõigile arendajatele tuttav kood.

Platvormispetsiifiline rakendus

Kuna Quarkus on GraalVM-iga tihedalt integreeritud, on loomulikult võimalik genereerida platvormipõhist koodi. Selleks tuleb installida GraalVM ja määrata GRAALVM_HOME keskkonnamuutuja. Edasi registreerige profiil kokkupanekuks ja täpsustage see rakenduse loomisel:

mvn package -Pnative

Huvitaval kombel saab loodud rakendust testida. Ja see on oluline, kuna algkoodi täitmine võib JVM-is käitamisest erineda. @SubstrateTest annotatsioon käitab platvormipõhist rakenduse koodi. Olemasoleva testkoodi taaskasutamist saab teha pärimise teel; selle tulemusel näeb platvormist sõltuva rakenduse testimise kood välja järgmine:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Loodud pildi saab pakkida Dockerisse ja käivitada Kubernetesis või OpenShiftis, mida on üksikasjalikult kirjeldatud juhiseid.

Toolkit

Quarkuse raamistikku saab kasutada koos Maveni ja Gradle'iga. Erinevalt Gradle'ist on Maven täielikult toetatud. Paraku hetkel Gradle tühja projekti genereerimist ei toeta, kodulehel on täpsem info olemas õpik.

Laiendused

Quarkus on laiendatav raamistik. Hetkel on tellimus olemas 40 laiendust, mis lisavad erinevaid funktsioone – alates toest Vedru DI konteiner и Apache kaamel enne teenuste käitamise mõõdikute logimist ja avaldamist. Ja lisaks Javale on juba olemas laiendus, mis toetab Kotlinis rakenduste kirjutamist.

Järeldus

Quarkus on minu meelest üsna omaaegsete trendidega kooskõlas. Taustaprogrammi koodiarendus muutub üha lihtsamaks ning see raamistik lihtsustab ja kiirendab veelgi teenusearendust, lisades Dockeri ja Kubernetese natiivse toe. Suureks plussiks on GraalVM-i sisseehitatud tugi ja platvormist sõltuvate piltide genereerimine, mis võimaldab teenustel väga kiiresti käivituda ja võtta vähe mäluruumi. Ja see on väga oluline meie ajal, mil me tunneme massilist kirge mikroteenuste ja serverita arhitektuuri vastu.

Ametlik sait - quarkus.io. Näited projektidest kiireks alustamiseks on juba saadaval aadressil GitHub.

Allikas: www.habr.com

Lisa kommentaar