Innledning
XNUMX. mars, RedHat (snart IBM)
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å
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
@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
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
Инструментарий
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
utvidelse
Quarkus er et utvidbart rammeverk. For øyeblikket er det en ordre
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 -
Kilde: www.habr.com