
Introduktion
Den 7 mars meddelade företaget RedHat (snart IBM) ett nytt ramverk â . Enligt utvecklarna bygger detta ramverk pĂ„ GraalVM och OpenJDK HotSpot och Ă€r avsett för Kubernetes. Quarkus-stack inkluderar: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus och andra.
Syftet med skapandet Àr att göra Java till en ledande plattform för distribution i Kubernetes och utveckling av serverlösa applikationer, genom att ge utvecklare en enhetlig metod för utveckling bÄde i reaktiv och imperativ stil.
Om vi ser pÄ klassificeringen av ramverk, Àr Quarkus nÄgonstans mellan "Aggregators/Code Generators" och "High-level fullstack frameworks". Det Àr redan mer Àn en aggregator, men nÄr fortfarande inte upp till fullstack, eftersom det Àr inriktat pÄ backend-utveckling.
Mycket hög starttid för applikationen och lÄg minnesförbrukning utlovas. HÀr Àr data frÄn utvecklarens webbplats:
Tiden frÄn start till första svar (s):
Konfiguration
REST
REST+JPA
Quarkus+GraalVM
0.014
0.055
Quarkus+OpenJDK
0.75
2.5
Traditionell Cloud Native Stack*
4.3
9.5
Minnesförbrukning (Mb):
Konfiguration
REST
REST+JPA
Quarkus+GraalVM
13
35
Quarkus+OpenJDK
74
130
Traditionell Cloud Native Stack*
140
218
Imponerande, eller hur?
*Jag har inte hittat information om denna teknikstack, man kan anta att det Àr nÄgot slags Spring Boot med extra tillÀgg..
Hello World!
Det enklaste applikationen skriven i Quarkus skulle se ut sÄ hÀr:
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
}Det Àr bokstavligen en klass och det rÀcker! Applikationen kan startas med hjÀlp av Maven i utvecklingslÀge:
mvn compile quarkus:dev
âŠ
$ curl http://localhost:8080/hello
helloSkillnaden frĂ„n vanliga applikationer Ă€r â ingen Application-klass! Quarkus stödjer hot reload, sĂ„ att man kan Ă€ndra applikationen utan att starta om den, vilket gör utvecklingen Ă€nnu snabbare.
Vad hÀnder hÀrnÀst? Man kan lÀgga till en tjÀnst i kontrollern med hjÀlp av annoteringen . Koden för tjÀnsten:
@ApplicationScoped
public class GreetingService {
public String greeting(String name) {
return "Hello " + name + "!";
}
}Kontrollern:
@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!Observera att Quarkus anvĂ€nder standardannoteringar frĂ„n vĂ€lkĂ€nda ramverk â CDI och JAX-RS. Det finns inget nytt att lĂ€ra sig, om du har arbetat med CDI och JAX-RS tidigare, förstĂ„s.
Arbete med databas
Hibernate och standard JPA-annoteringar anvÀnds för entiteter. Precis som med REST-kontroller krÀvs det minimalt med kod. Det rÀcker att ange beroenden i byggfilen och lÀgga till annoteringar. @Entity och konfigurera datakÀlla i application.properties.
Det Àr allt. Inga sessionFactory, persistence.xml och andra tjÀnstefiler. Skriv bara den kod som behövs. Men om det behövs kan du skapa en persistence.xml-fil och konfigurera ORM-lagret mer detaljerat.
Quarkus stödjer caching av entiteter, kollektioner för en-till-mÄnga-relationer och Àven förfrÄgningar. PÄ ytan ser det bra ut, men det Àr lokalt caching för en enda Kubernetes-nod. D.v.s. cachar mellan olika noder Àr inte synkroniserade. Jag hoppas att detta Àr tillfÀlligt.
Asynkron kod exekvering
Som redan nÀmnts stödjer Quarkus ocksÄ reaktiv programmering. Koden för den tidigare applikationen kan skrivas pÄ ett annat sÀtt.
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/{name}")
public CompletionStage greeting(@PathParam("name") String name) {
return CompletableFuture.supplyAsync(() -> {
return "Hello " + name + "!";
});
}
}Asynkron kod kan ocksÄ flyttas till en tjÀnst, resultatet blir detsamma.
Testning
Tester för Quarkus-applikationer kan skrivas med JUnit4 eller JUnit5. HÀr Àr ett exempel pÄ ett test för endpointen, skrivet med RestAssured, men ett annat ramverk kan anvÀndas:
@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 + "!"));
}
}Annoteringen @QuarkusTest föreskriver att applikationen ska startas innan testerna körs. I övrigt â bekant kod för alla utvecklare.
Plattformsberoende applikation
Eftersom Quarkus Àr tÀtt integrerat med GraalVM kan plattformsberoende kod genereras. För detta krÀvs att GraalVM installeras och miljövariabeln GRAALVM_HOME anges. Sedan och ange den vid byggandet av applikationen:
mvn package -PnativeDet som Àr intressant Àr att den genererade applikationen kan testas. Detta Àr viktigt eftersom körningen av "inbyggd" kod kan skilja sig frÄn körningen pÄ JVM. Annotationen @SubstrateTest kör plattformsberoende kod för applikationen. à teranvÀndning av existerande testkod kan göras med hjÀlp av arv, vilket gör att koden för att testa plattformsberoende applikationer ser ut sÄ hÀr:
@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {
}Den genererade bilden kan packas i Docker och köras i Kubernetes eller OpenShift, detaljerat beskrivet i .
VerktygslÄda
Ramverket Quarkus kan anvÀndas med Maven och Gradle. Maven stöds fullt ut, till skillnad frÄn Gradle. TyvÀrr stöder Gradle i nulÀget inte skapandet av tomma projekt, det finns detaljerad information pÄ webbplatsen. .
TillÀgg
Quarkus Àr ett utbyggbart ramverk. För nÀrvarande finns det omkring , som lÀgger till olika funktioner - frÄn stöd för och till loggning och publicering av metrik för aktiva tjÀnster. Det finns redan ett tillÀgg för att stödja skapandet av applikationer pÄ sprÄket Kotlin, utöver Java.
Slutsats
Enligt min mening Àr Quarkus helt i linje med tidens trender. Utvecklingen av backendkod blir allt enklare, och detta ramverk förenklar och pÄskyndar utvecklingen av tjÀnster ytterligare, med "inbyggt" stöd för Docker och Kubernetes. En stor fördel Àr det inbyggda stödet för GraalVM och skapandet av plattformsberoende bilder, vilket gör att tjÀnster kan starta verkligen snabbt och ta upp lite minne. Detta Àr mycket viktigt i vÄr tid av massintresse för mikrotjÀnster och serverlös arkitektur.
Den officiella webbplatsen - . Exempel pÄ projekt för snabb start finns redan pÄ .
KĂ€lla: habr.com
