Quarkus huwa Java subatomika supersonika. Ħarsa ġenerali qasira tal-qafas

Quarkus huwa Java subatomika supersonika. Ħarsa ġenerali qasira tal-qafas

Introduzzjoni

Fis-7 ta' Marzu, RedHat (dalwaqt IBM) ippreżentata qafas ġdid - quarkus. Skont l-iżviluppaturi, dan il-qafas huwa bbażat fuq GraalVM u OpenJDK HotSpot u huwa ddisinjat għal Kubernetes. Il-munzell Quarkus jinkludi: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus u oħrajn.

L-għan huwa li Java ssir il-pjattaforma ewlenija għall-iskjerament ta 'Kubernetes u l-iżvilupp ta' applikazzjoni mingħajr server, li tipprovdi lill-iżviluppaturi b'approċċ unifikat għall-iżvilupp kemm fi stili reattivi kif ukoll imperattivi.

Jekk tħares lejn dan klassifikazzjoni ta 'oqfsa, allura Quarkus huwa x'imkien bejn "Aggregaturi / Ġeneraturi tal-Kodiċi" u "Oqfsa fullstack ta' livell għoli". Dan diġà huwa aktar minn aggregatur, iżda lanqas biss jilħaq full-stack, għaliex imfassla għall-iżvilupp backend.

Veloċità għolja ħafna tat-tnedija tal-applikazzjoni u konsum baxx ta 'memorja huma mwiegħda. Hawnhekk hawn id-dejta mill-websajt tal-iżviluppatur:

Ħin mill-bidu sal-ewwel rispons(i):

Konfigurazzjoni
SERĦAN
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Cloud Native Stack tradizzjonali*
4.3
9.5

Konsum tal-memorja (Mb):

Konfigurazzjoni
SERĦAN
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Cloud Native Stack tradizzjonali*
140
218

Impressjonanti, hux?

*Ma sibt l-ebda informazzjoni dwar dan il-munzell tat-teknoloġija, nistgħu nassumu li dan huwa xi tip ta 'Spring Boot b'kit tal-ġisem addizzjonali.

Hello dinja!

L-aktar applikazzjoni sempliċi miktuba f'Quarkus tidher bħal din:

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

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

Huwa litteralment klassi waħda u dan huwa biżżejjed! Tista 'tħaddem l-applikazzjoni billi tuża Maven fil-mod ta' żvilupp:

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

Id-differenza minn applikazzjoni regolari hija li m'hemm l-ebda klassi ta 'Applikazzjoni! Quarkus jappoġġja hot reload, sabiex tkun tista' tibdel l-applikazzjoni tiegħek mingħajr ma terġa' tibda, u b'hekk l-iżvilupp ikun saħansitra aktar mgħaġġel.

X'inhu jmiss? Tista' żżid servizz ma' kontrollur billi tuża annotazzjoni Injetta. Kodiċi tas-servizz:

@ApplicationScoped
public class GreetingService {

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

Kontrollur:

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

Innota li Quarkus juża annotazzjonijiet standard minn oqfsa familjari - CDI u JAX-RS. M'hemmx għalfejn titgħallem xi ħaġa ġdida jekk ħdimt ma' CDI u JAX-RS qabel, ovvjament.

Ħidma mad-database

Jintużaw annotazzjonijiet Hibernate u standard JPA għall-entitajiet. Bħal fil-każ tal-kontrolluri REST, trid tikteb minimu ta 'kodiċi. Huwa biżżejjed li tindika d-dipendenzi fil-fajl tal-assemblaġġ, żid annotazzjonijiet @Entity u kkonfigurat datasource f'application.properties.

Kollha. L-ebda sessionFactory, persistence.xml jew fajls oħra ta’ servizz. Aħna niktbu biss il-kodiċi li huwa meħtieġ. Madankollu, jekk meħtieġ, tista 'toħloq fajl persistentence.xml u tikkonfigura s-saff ORM b'mod aktar fin.

Quarkus jappoġġja l-caching ta' entitajiet, kollezzjonijiet għal relazzjonijiet minn wieħed għal ħafna, u mistoqsijiet. L-ewwel daqqa t'għajn jidher tajjeb ħafna, imma hekk lokali caching, għal nodu wieħed Kubernetes. Dawk. Il-caches ta 'nodi differenti mhumiex sinkronizzati ma' xulxin. Nispera li dan huwa temporanju.

Eżekuzzjoni ta' kodiċi mhux sinkroniku

Kif imsemmi hawn fuq, Quarkus jappoġġja wkoll l-istil tal-ipprogrammar reattiv. Il-kodiċi tal-applikazzjoni preċedenti jista' jinkiteb f'forma differenti.

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

Kodiċi asinkronu jista 'wkoll jiġi trasferit għas-servizz, ir-riżultat se jkun l-istess.

Ittestjar

It-testijiet għall-applikazzjonijiet tal-Quarkus jistgħu jinkitbu f'JUnit4 jew JUnit5. Hawn taħt hemm test eżempju għal endpoint, huwa miktub bl-użu RestAssured, iżda jista 'jintuża qafas ieħor:

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

L-annotazzjoni @QuarkusTest tagħtik istruzzjonijiet biex tħaddem l-applikazzjoni qabel ma tmexxi t-testijiet. Il-bqija huwa kodiċi familjari għall-iżviluppaturi kollha.

Applikazzjoni speċifika għall-pjattaforma

Peress li Quarkus huwa integrat sewwa ma 'GraalVM, huwa naturalment possibbli li jiġi ġġenerat kodiċi speċifiku għall-pjattaforma. Biex tagħmel dan, trid tinstalla GraalVM u tispeċifika l-varjabbli ambjentali GRAALVM_HOME. Aktar minn hekk irreġistra profil għall-assemblaġġ u speċifikaha meta tibni l-applikazzjoni:

mvn package -Pnative

Interessanti, l-applikazzjoni ġġenerata tista 'tiġi ttestjata. U dan huwa importanti għaliex l-eżekuzzjoni tal-kodiċi nattiv tista 'tvarja mill-eżekuzzjoni fuq il-JVM. L-annotazzjoni @SubstrateTest tħaddem kodiċi ta' applikazzjoni speċifiku għall-pjattaforma. L-użu mill-ġdid tal-kodiċi tat-test eżistenti jista 'jsir bl-użu tal-wirt; bħala riżultat, il-kodiċi għall-ittestjar ta' applikazzjoni li tiddependi mill-pjattaforma tidher bħal din:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

L-immaġni ġġenerata tista' tiġi ppakkjata f'Docker u titħaddem f'Kubernetes jew OpenShift, deskritta fid-dettall f' istruzzjonijiet.

Għodda tal-għodda

Il-qafas Quarkus jista 'jintuża ma' Maven u Gradle. Maven huwa appoġġjat bis-sħiħ, kuntrarjament għal Gradle. Sfortunatament, bħalissa Gradle ma jappoġġjax il-ġenerazzjoni ta' proġett vojt; hemm informazzjoni dettaljata fuq il-websajt ktieb.

Estensjonijiet

Quarkus huwa qafas estensibbli. Bħalissa hemm ordni 40 estensjoni, li jżidu funzjonalità varji - mill-appoġġ Rebbiegħa DI kontenitur и Apache Camel qabel illoggjar u pubblikazzjoni metriċi għat-tmexxija tas-servizzi. U diġà hemm estensjoni biex tappoġġja l-applikazzjonijiet tal-kitba f'Kotlin, minbarra Java.

Konklużjoni

Fl-opinjoni tiegħi, Quarkus huwa pjuttost konformi max-xejriet taż-żmien. L-iżvilupp tal-kodiċi backend qed isir aktar faċli u aktar faċli, u dan il-qafas jissimplifika u jħaffef aktar l-iżvilupp tas-servizz billi jżid appoġġ nattiv għal Docker u Kubernetes. Plus kbir huwa l-appoġġ integrat għal GraalVM u l-ġenerazzjoni ta 'immaġini li jiddependu mill-pjattaforma, li jippermetti li s-servizzi jibdew verament malajr u jieħdu ftit spazju għall-memorja. U dan huwa importanti ħafna fi żmienna ta 'passjoni tal-massa għal mikroservizzi u arkitettura bla server.

Sit uffiċjali - quarkus.io. Eżempji ta 'proġetti għal bidu ta' malajr huma diġà disponibbli fuq GitHub.

Sors: www.habr.com

Żid kumment