Quarkus is in supersonysk subatomysk Java. Koart oersjoch fan it ramt

Quarkus is in supersonysk subatomysk Java. Koart oersjoch fan it ramt

Ynlieding

Op XNUMX maart, RedHat (gau IBM) presintearre nij ramt - quarkus. Neffens de ûntwikkelders is dit ramt basearre op GraalVM en OpenJDK HotSpot en is ûntwurpen foar Kubernetes. De Quarkus-stapel befettet: JPA / Hibernate, JAX-RS / RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus en oaren.

It doel is om Java it liedende platfoarm te meitsjen foar Kubernetes-ynset en tsjinnerleaze applikaasjeûntwikkeling, wêrtroch ûntwikkelders in unifoarme oanpak fan ûntwikkeling yn sawol reaktive as ymperatyf stilen leverje.

As jo ​​sjogge nei dit klassifikaasje fan kaders, dan is Quarkus earne tusken "Aggregators / Code Generators" en "High-level fullstack frameworks". Dit is al mear as in aggregator, mar it berikt net iens folsleine stack, om't ... maatwurk foar backend ûntwikkeling.

Hiel hege snelheid fan lansearring fan applikaasjes en leech ûnthâldferbrûk wurde tasein. Hjir binne de gegevens fan 'e webside fan' e ûntwikkelders:

Tiid fan begjin oant earste reaksje(s):

Konfiguraasje
RÊST
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Tradysjonele Cloud Native Stack*
4.3
9.5

Unthâldferbrûk (Mb):

Konfiguraasje
RÊST
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Tradysjonele Cloud Native Stack*
140
218

Yndrukwekkend, is it net?

*Ik haw gjin ynformaasje fûn oer dizze technologystapel, wy kinne oannimme dat dit in soarte fan Spring Boot is mei in ekstra lichemskit.

Hallo wrâld!

De ienfâldichste applikaasje skreaun yn Quarkus soe der sa útsjen:

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

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

It is letterlik ien klasse en dat is genôch! Jo kinne de applikaasje útfiere mei Maven yn ûntwikkelingsmodus:

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

It ferskil fan in gewoane applikaasje is dat d'r gjin applikaasjeklasse is! Quarkus stipet hot reload, sadat jo jo applikaasje kinne feroarje sûnder it opnij te starten, wêrtroch ûntwikkeling noch rapper wurdt.

Wat komt hjirnei? Jo kinne in tsjinst tafoegje oan in controller mei in annotaasje Ynjeksje. Tsjinstkoade:

@ApplicationScoped
public class GreetingService {

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

Controller:

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

Tink derom dat Quarkus standert annotaasjes brûkt fan fertroude kaders - CDI en JAX-RS. D'r is gjin ferlet om wat nijs te learen as jo earder mei CDI en JAX-RS wurke hawwe, fansels.

Wurkje mei de databank

Hibernate en standert JPA-annotaasjes foar entiteiten wurde brûkt. Lykas by REST-controllers, moatte jo in minimum koade skriuwe. It is genôch om de ôfhinklikens oan te jaan yn it gearstallingsbestân, annotaasjes tafoegje @Entity en konfigurearje gegevensboarne yn application.properties.

Alle. Gjin sessionFactory, persistence.xml of oare tsjinst triemmen. Wy skriuwe allinich de koade dy't nedich is. As it nedich is, kinne jo lykwols in persistence.xml-bestân oanmeitsje en de ORM-laach fyner konfigurearje.

Quarkus stipet caching fan entiteiten, kolleksjes foar ien-op-in protte relaasjes, en queries. Op it earste each sjocht it geweldich, mar it is it pleatslik caching, foar ien Kubernetes node. Dy. De caches fan ferskate knooppunten wurde net syngronisearre mei elkoar. Ik hoopje dat dit tydlik is.

Asynchronous koade útfiering

Lykas hjirboppe neamd, stipet Quarkus ek de reaktive programmearringstyl. De koade fan 'e foarige applikaasje kin yn in oare foarm skreaun wurde.

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

Asynchrone koade kin ek wurde oerdroegen oan 'e tsjinst, it resultaat sil itselde wêze.

Testing

Tests foar Quarkus-applikaasjes kinne wurde skreaun yn JUnit4 of JUnit5. Hjirûnder is in foarbyldtest foar in einpunt, it is skreaun mei RestAssured, mar in oar ramt kin brûkt wurde:

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

De @QuarkusTest-annotaasje ynstruearret jo de applikaasje út te fieren foardat jo testen útfiere. De rest is koade bekend foar alle ûntwikkelders.

Platfoarm-spesifike applikaasje

Sûnt Quarkus is strak yntegrearre mei GraalVM, is it fansels mooglik te generearjen platfoarm-spesifike koade. Om dit te dwaan moatte jo GraalVM ynstallearje en de omjouwingsfariabele GRAALVM_HOME opjaan. Fierder registrearje in profyl foar gearkomste en spesifisearje it by it bouwen fan de applikaasje:

mvn package -Pnative

Ynteressant kin de oanmakke applikaasje wurde hifke. En dit is wichtich om't de útfiering fan native koade kin ferskille fan útfiering op 'e JVM. De @SubstrateTest annotaasje rint platfoarm-spesifike applikaasje koade. It opnij brûken fan besteande testkoade kin dien wurde mei erfskip; as gefolch sil de koade foar it testen fan in platfoarm-ôfhinklike applikaasje der sa útsjen:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

De oanmakke ôfbylding kin wurde ferpakt yn Docker en rinne yn Kubernetes of OpenShift, yn detail beskreaun yn ynstruksjes.

Toolkit

It Quarkus-ramt kin brûkt wurde mei Maven en Gradle. Maven wurdt folslein stipe, yn tsjinstelling ta Gradle. Spitigernôch stipet Gradle op it stuit net it generearjen fan in leech projekt; d'r is detaillearre ynformaasje op 'e webside learboek.

Extensions

Quarkus is in útbreidbere ramt. Op it stuit is der in oarder 40 útwreidings, dy't ferskate funksjonaliteit tafoegje - fan stipe Spring DI kontener и Apache Camel foardat jo metriken oanmelde en publisearje foar it útfieren fan tsjinsten. En d'r is al in útwreiding om skriuwapplikaasjes te stypjen yn Kotlin, neist Java.

konklúzje

Neffens my is Quarkus hielendal yn oerienstimming mei de trends fan de tiid. Untwikkeling fan backend-koade wurdt makliker en makliker, en dit ramt ferienfâldiget en fersnelt de tsjinstûntwikkeling fierder troch native stipe ta te foegjen foar Docker en Kubernetes. In enoarme plus is de ynboude stipe foar GraalVM en de generaasje fan platfoarm-ôfhinklike ôfbyldings, wêrtroch tsjinsten echt fluch begjinne kinne en lytse ûnthâldromte ynnimme. En dit is heul wichtich yn ús tiid fan massale passy foar mikrotsjinsten en serverleaze arsjitektuer.

Offisjele side - quarkus.io. Foarbylden fan projekten foar in flugge start binne al beskikber op GitHub.

Boarne: www.habr.com

Add a comment