Quarkus is supersoniese subatomiese Java. Kort oorsig van die raamwerk

Quarkus is supersoniese subatomiese Java. Kort oorsig van die raamwerk

Inleiding

XNUMX Maart, RedHat (binnekort - IBM) aangebied nuwe raamwerk - Kwark. Volgens die ontwikkelaars is hierdie raamwerk gebaseer op GraalVM en OpenJDK HotSpot en is dit ontwerp vir Kubernetes. Die Quarkus-stapel sluit in: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus en meer.

Die doel van die skepping is om Java die toonaangewende platform vir Kubernetes-ontplooiing en ontwikkeling van bedienerlose toepassings te maak, wat ontwikkelaars 'n verenigde benadering tot ontwikkeling in beide reaktiewe en noodsaaklike style bied.

Kyk na hierdie klassifikasie van raamwerke, dan is Quarkus iewers tussen "Aggregators / Kode Generators" en "Hoë-vlak volstapel raamwerke". Dit is reeds meer as 'n aggregator, maar dit skiet ook tekort aan volle stapel, want. gefokus op backend-ontwikkeling.

Beloof 'n baie hoë toepassing opstartspoed en lae geheueverbruik. Hier is die data van die ontwikkelaar se webwerf:

Tyd van begin tot eerste reaksie(s):

opset
REST
RUS+JPA

Quarkus + GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Tradisionele wolk-inheemse stapel*
4.3
9.5

Geheueverbruik (Mb):

opset
REST
RUS+JPA

Quarkus + GraalVM
13
35

Quarkus+OpenJDK
74
130

Tradisionele wolk-inheemse stapel*
140
218

Indrukwekkend, is dit nie?

*Ek het nie inligting oor hierdie tegnologiestapel gekry nie, ons kan aanvaar dat dit 'n soort Spring Boot is met 'n bykomende liggaamstel.

Hello Wêreld!

Die eenvoudigste toepassing wat in Quarkus geskryf is, sal soos volg lyk:

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

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

Dit is letterlik een klas en dit is genoeg! U kan die toepassing met Maven in ontwikkelingsmodus laat loop:

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

Die verskil van die gewone toepassing is dat daar geen toepassingsklas is nie! Quarkus ondersteun warm herlaai, sodat jy die toepassing kan verander sonder om dit weer te begin, en sodoende ontwikkeling selfs vinniger maak.

Wat is volgende? U kan 'n diens by die beheerder voeg deur 'n aantekening te gebruik spuit. Dienskode:

@ApplicationScoped
public class GreetingService {

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

Beheerder:

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

Let daarop dat Quarkus standaardaantekeninge van bekende raamwerke gebruik - CDI en JAX-RS. Daar is natuurlik niks nuuts om te leer as jy voorheen met CDI en JAX-RS gewerk het nie.

Werk met die databasis

Gebruik deur Hibernate en standaard JPA-entiteitaantekeninge. Soos met REST-beheerders, moet jy 'n minimum kode skryf. Dit is genoeg om afhanklikhede in die samestellinglêer te spesifiseer, aantekeninge te plaas @Entity en stel databron op in application.properties.

Almal. Geen sessionFactory, persistence.xml en ander dienslêers nie. Ons skryf slegs die kode wat nodig is. Indien nodig, kan jy egter 'n persistence.xml-lêer skep en die ORM-laag verfyn.

Quarkus ondersteun kas van entiteite, versamelings vir een-tot-veel verhoudings en navrae. Met die eerste oogopslag lyk dit wonderlik, maar dit plaaslike kas, vir 'n enkele Kubernetes-nodus. Dié. kas van verskillende nodusse word nie met mekaar gesinchroniseer nie. Ek hoop dit is tydelik.

Asinchroniese kode uitvoering

Soos hierbo genoem, ondersteun Quarkus ook 'n reaktiewe programmeringstyl. Die kode van die vorige aansoek kan in 'n ander vorm geskryf word.

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

Asinchroniese kode kan ook na 'n diens geskuif word, die resultaat sal dieselfde wees.

toets

Toetse vir Quarkus-toepassings kan in JUnit4 of JUnit5 geskryf word. Hieronder is 'n voorbeeldtoets vir 'n eindpunt, geskryf met RestAssured, maar ander raamwerke kan gebruik word:

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

Die @QuarkusTest-aantekening gee opdrag om die toepassing te laat loop voordat die toetse uitgevoer word. Die res is kode wat aan alle ontwikkelaars bekend is.

Platform-spesifieke toepassing

Aangesien Quarkus stewig geïntegreer is met GraalVM, is dit natuurlik moontlik om inheemse kode te genereer. Om dit te doen, moet jy GraalVM installeer en die GRAALVM_HOME omgewingsveranderlike spesifiseer. Verder 'n profiel vir montering voorskryf en spesifiseer dit wanneer die toepassing gebou word:

mvn package -Pnative

Interessant genoeg kan die gegenereerde toepassing getoets word. En dit is belangrik, want die uitvoering van inheemse kode kan verskil van die uitvoering op die JVM. Die @SubstrateTest-aantekening loop inheemse toepassingskode uit. Die hergebruik van die bestaande toetskode kan met oorerwing gedoen word, gevolglik sal die kode vir die toets van 'n platformspesifieke toepassing soos volg lyk:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Die gegenereerde beeld kan in Docker verpak word en in Kubernetes of OpenShift uitgevoer word, in detail beskryf in instruksies.

Gereedskap

Die Quarkus-raamwerk kan met Maven en Gradle gebruik word. Maven word ten volle ondersteun, anders as Gradle. Ongelukkig, op die oomblik dat Gradle nie die generering van 'n leë projek ondersteun nie, het die webwerf 'n gedetailleerde handboek.

uitbreiding

Quarkus is 'n uitbreidbare raamwerk. Op die oomblik is daar ongeveer 40 uitbreidings, wat verskeie funksies byvoeg - van ondersteuning Spring DI-houer и Apache Kameel om aan te meld en te publiseer metrieke vir die bestuur van dienste. En daar is reeds 'n uitbreiding om skryftoepassings in die Kotlin-taal te ondersteun, benewens Java.

Gevolgtrekking

Quarkus is myns insiens nogal in die tendense van die tyd. Die ontwikkeling van backend-kode word makliker en makliker, en hierdie raamwerk vereenvoudig en versnel diensontwikkeling selfs meer deur inheemse ondersteuning vir Docker en Kubernetes by te voeg. ’n Groot pluspunt is die ingeboude ondersteuning vir GraalVM en die generering van platformspesifieke beelde, wat jou toelaat om dienste baie vinnig te laat begin en min geheuespasie op te neem. En dit is baie belangrik in ons tyd van massa-entoesiasme vir mikrodienste en bedienerlose argitektuur.

Amptelike webwerf - quarkus.io. Voorbeelde van projekte vir 'n vinnige begin is reeds aan GitHub.

Bron: will.com

Voeg 'n opmerking