Quarkus estas supersona subatoma Java. Mallonga superrigardo de la kadro

Quarkus estas supersona subatoma Java. Mallonga superrigardo de la kadro

Enkonduko

La XNUMX-an de marto, RedHat (baldaŭ IBM) prezentita nova kadro - quarkus. Laŭ la programistoj, ĉi tiu kadro baziĝas sur GraalVM kaj OpenJDK HotSpot kaj estas desegnita por Kubernetes. La Quarkus-stako inkluzivas: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus kaj aliaj.

La celo estas igi Javan la gvida platformo por Kubernetes-deplojo kaj senservila aplikaĵo-disvolviĝo, provizante al programistoj unuigitan aliron al evoluo en ambaŭ reaktivaj kaj nepraj stiloj.

Se vi rigardas ĉi tio klasifiko de kadroj, tiam Quarkus estas ie inter "Agregatoroj/Kodaj Generatoroj" kaj "Altnivelaj plenstakaj kadroj". Ĉi tio jam estas pli ol agregatoro, sed ĝi eĉ ne atingas plenan stakon, ĉar... tajlorita por disvolviĝo de backend.

Tre alta rapideco de lanĉo de aplikaĵo kaj malalta memorkonsumo estas promesitaj. Jen la datumoj de la retejo de la programisto:

Tempo de komenco ĝis unua(j) respondo(j):

Agordo
RESTA
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Tradicia Nuba Indiĝena Stako*
4.3
9.5

Memorkonsumo (Mb):

Agordo
RESTA
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Tradicia Nuba Indiĝena Stako*
140
218

Imprese, ĉu ne?

*Mi ne trovis ajnan informon pri ĉi tiu teknologia stako, ni povas supozi, ke ĉi tio estas ia Printempa Boto kun plia korpokompleto..

Saluton mondo!

La plej simpla aplikaĵo skribita en Quarkus aspektus jene:

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

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

Ĝi estas laŭvorte unu klaso kaj tio sufiĉas! Vi povas ruli la aplikaĵon uzante Maven en disvolva reĝimo:

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

La diferenco de regula aplikaĵo estas, ke ne ekzistas Aplika klaso! Quarkus subtenas varman reŝargon, do vi povas ŝanĝi vian aplikaĵon sen rekomenci ĝin, igante disvolviĝon eĉ pli rapida.

Kio sekvas? Vi povas aldoni servon al regilo per komentario Injekti. Servokodo:

@ApplicationScoped
public class GreetingService {

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

Regilo:

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

Notu, ke Quarkus uzas normajn komentadojn de konataj kadroj - CDI kaj JAX-RS. Ne necesas lerni ion novan se vi jam antaŭe laboris kun CDI kaj JAX-RS, kompreneble.

Laborante kun la datumbazo

Hibernate kaj normaj JPA komentarioj por entoj estas uzataj. Kiel ĉe REST-regiloj, vi devas skribi minimumon da kodo. Sufiĉas indiki la dependecojn en la asemblea dosiero, aldoni komentariojn @Entity kaj agordi datumfonton en application.properties.

Ĉiuj. Neniu sessionFactory, persistence.xml aŭ aliaj servodosieroj. Ni skribas nur la kodon kiu estas bezonata. Tamen, se necese, vi povas krei persistence.xml dosieron kaj agordi la ORM-tavolon pli fajne.

Quarkus subtenas kaŝmemoron de entoj, kolektoj por unu-al-multaj rilatoj kaj demandoj. Unuavide ĝi aspektas bonega, sed ĝi estas loka kaŝmemoro, por unu Kubernetes nodo. Tiuj. La kaŝmemoroj de malsamaj nodoj ne estas sinkronigitaj unu kun la alia. Mi esperas, ke ĉi tio estas provizora.

Nesinkrona koda ekzekuto

Kiel menciite supre, Quarkus ankaŭ subtenas la reaktivan programstilon. La kodo de la antaŭa aplikaĵo povas esti skribita en malsama formo.

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

Nesinkrona kodo ankaŭ povas esti translokigita al la servo, la rezulto estos la sama.

Testado

Testoj por Quarkus-aplikoj povas esti skribitaj en JUnit4 aŭ JUnit5. Malsupre estas ekzempla testo por finpunkto, ĝi estas skribita per RestAssured, sed alia kadro povas esti uzata:

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

La komentario @QuarkusTest instrukcias vin ruli la aplikaĵon antaŭ ol fari testojn. La resto estas kodo konata al ĉiuj programistoj.

Platform-specifa aplikaĵo

Ĉar Quarkus estas forte integrita kun GraalVM, kompreneble eblas generi platform-specifan kodon. Por fari tion, vi devas instali GraalVM kaj specifi la mediovariablon GRAALVM_HOME. Plue registri profilon por kunigo kaj specifu ĝin dum konstruado de la aplikaĵo:

mvn package -Pnative

Interese, la generita aplikaĵo povas esti provita. Kaj ĉi tio estas grava ĉar la ekzekuto de indiĝena kodo povas diferenci de ekzekuto sur la JVM. La komentario @SubstrateTest rulas platform-specifan aplikaĵokodon. Reuzi ekzistantan testkodon povas esti farita uzante heredon; kiel rezulto, la kodo por testi platform-dependan aplikaĵon aspektos jene:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

La generita bildo povas esti enpakita en Docker kaj ruliĝi en Kubernetes aŭ OpenShift, priskribitaj detale en instrukcioj.

Ilaro

La Quarkus-kadro povas esti uzata kun Maven kaj Gradle. Maven estas plene subtenata, male al Gradle. Bedaŭrinde, nuntempe Gradle ne subtenas generi malplenan projekton; estas detalaj informoj en la retejo. lernolibro.

Etendoj

Quarkus estas etendebla kadro. Nuntempe estas mendo 40 etendaĵoj, kiuj aldonas diversajn funkciojn - de subteno Spring DI-ujo и Apaĉa Kamelo antaŭ registri kaj publikigi metrikojn por funkciigado de servoj. Kaj jam ekzistas etendo por subteni skribajn aplikaĵojn en Kotlin, krom Java.

konkludo

Laŭ mi, Quarkus sufiĉe konformas al la tiamaj tendencoj. Disvolviĝo de malantaŭa kodo fariĝas pli facila kaj pli facila, kaj ĉi tiu kadro pli simpligas kaj akcelas servo-disvolviĝon aldonante denaskan subtenon por Docker kaj Kubernetes. Grandega pluso estas la enkonstruita subteno por GraalVM kaj la generacio de platform-dependaj bildoj, kio permesas al servoj komenci vere rapide kaj okupi malmulte da memorspaco. Kaj ĉi tio estas tre grava en nia tempo de amasa pasio por mikroservoj kaj senservila arkitekturo.

Oficiala retejo - quarkus.io. Ekzemploj de projektoj por rapida komenco jam haveblas GitHub.

fonto: www.habr.com

Aldoni komenton