Quarkus er en supersonisk subatomisk Java. Kort oversikt over rammeverket

Quarkus er en supersonisk subatomisk Java. Kort oversikt over rammeverket

Innledning

XNUMX. mars, RedHat (snart IBM) presentert nytt rammeverk - quarkus. Ifølge utviklerne er dette rammeverket basert på GraalVM og OpenJDK HotSpot og er designet for Kubernetes. Quarkus-stakken inkluderer: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus og andre.

Målet er å gjøre Java til den ledende plattformen for Kubernetes-distribusjon og serverløs applikasjonsutvikling, og gi utviklere en enhetlig tilnærming til utvikling i både reaktive og imperative stiler.

Hvis du ser på dette klassifisering av rammeverk, så er Quarkus et sted mellom "Aggregators/Code Generators" og "High-level fullstack frameworks". Dette er allerede mer enn en aggregator, men det når ikke engang full stack, fordi... skreddersydd for backend-utvikling.

Svært høy hastighet på applikasjonsstart og lavt minneforbruk er lovet. Her er dataene fra utviklerens nettsted:

Tid fra start til første svar(er):

Konfigurasjon
REST
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Tradisjonell Cloud Native Stack*
4.3
9.5

Minneforbruk (Mb):

Konfigurasjon
REST
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Tradisjonell Cloud Native Stack*
140
218

Imponerende, ikke sant?

*Jeg fant ingen informasjon om denne teknologistabelen, vi kan anta at dette er en slags Spring Boot med et ekstra kroppssett.

Hei Verden!

Den enkleste applikasjonen skrevet i Quarkus vil se slik ut:

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

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

Det er bokstavelig talt én klasse og det er nok! Du kan kjøre applikasjonen ved å bruke Maven i utviklingsmodus:

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

Forskjellen fra en vanlig applikasjon er at det ikke er noen applikasjonsklasse! Quarkus støtter hot reload, slik at du kan endre applikasjonen uten å starte den på nytt, noe som gjør utviklingen enda raskere.

Hva blir det neste? Du kan legge til en tjeneste til en kontroller ved å bruke en merknad injisere. Tjenestekode:

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

Merk at Quarkus bruker standardmerknader fra kjente rammeverk - CDI og JAX-RS. Det er ikke nødvendig å lære noe nytt hvis du har jobbet med CDI og JAX-RS før, selvfølgelig.

Arbeid med databasen

Dvalemodus og standard JPA-kommentarer for enheter brukes. Som med REST-kontrollere, må du skrive et minimum av kode. Det er nok å indikere avhengighetene i monteringsfilen, legg til merknader @Entity og konfigurer datakilden i application.properties.

Alle. Ingen sessionFactory, persistence.xml eller andre tjenestefiler. Vi skriver kun koden som trengs. Om nødvendig kan du imidlertid opprette en persistence.xml-fil og konfigurere ORM-laget mer fin.

Quarkus støtter bufring av enheter, samlinger for én-til-mange-relasjoner og spørringer. Ved første øyekast ser det bra ut, men det er det lokal caching, for én Kubernetes-node. De. Cachene til forskjellige noder er ikke synkronisert med hverandre. Jeg håper dette er midlertidig.

Asynkron kodekjøring

Som nevnt ovenfor støtter Quarkus også den reaktive programmeringsstilen. Koden til forrige søknad kan skrives i en annen form.

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

Asynkron kode kan også overføres til tjenesten, resultatet blir det samme.

Testing

Tester for Quarkus-applikasjoner kan skrives i JUnit4 eller JUnit5. Nedenfor er en eksempeltest for et endepunkt, den er skrevet med RestAssured, men et annet rammeverk kan brukes:

@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-kommentaren instruerer deg om å kjøre applikasjonen før du kjører tester. Resten er kode kjent for alle utviklere.

Plattformspesifikk applikasjon

Siden Quarkus er tett integrert med GraalVM, er det selvsagt mulig å generere plattformspesifikk kode. For å gjøre dette må du installere GraalVM og spesifisere miljøvariabelen GRAALVM_HOME. Lengre registrere en profil for montering og spesifiser det når du bygger programmet:

mvn package -Pnative

Interessant nok kan den genererte applikasjonen testes. Og dette er viktig fordi kjøringen av opprinnelig kode kan avvike fra kjøringen på JVM. @SubstrateTest-kommentaren kjører plattformspesifikk applikasjonskode. Gjenbruk av eksisterende testkode kan gjøres ved å bruke arv; som et resultat vil koden for å teste en plattformavhengig applikasjon se slik ut:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Det genererte bildet kan pakkes i Docker og kjøres i Kubernetes eller OpenShift, beskrevet i detalj i instruksjoner.

Инструментарий

Quarkus-rammeverket kan brukes med Maven og Gradle. Maven støttes fullt ut, i motsetning til Gradle. Dessverre, for øyeblikket støtter ikke Gradle å generere et tomt prosjekt; det er detaljert informasjon på nettstedet lærebok.

utvidelse

Quarkus er et utvidbart rammeverk. For øyeblikket er det en ordre 40 utvidelser, som legger til ulike funksjoner - fra støtte Fjær DI beholder и Apache kamel før logging og publisering av beregninger for kjørende tjenester. Og det er allerede en utvidelse for å støtte skriving av applikasjoner i Kotlin, i tillegg til Java.

Konklusjon

Quarkus er etter min mening ganske i tråd med tidens trender. Utvikling av backend-kode blir enklere og enklere, og dette rammeverket forenkler og fremskynder tjenesteutviklingen ytterligere ved å legge til innebygd støtte for Docker og Kubernetes. Et stort pluss er den innebygde støtten for GraalVM og generering av plattformavhengige bilder, som lar tjenester starte veldig raskt og ta opp lite minneplass. Og dette er veldig viktig i vår tid med masse lidenskap for mikrotjenester og serverløs arkitektur.

Offisiell side - quarkus.io. Eksempler på prosjekter for en rask start er allerede tilgjengelig på GitHub.

Kilde: www.habr.com

Legg til en kommentar