Quarkus este un Java subatomic supersonic. Scurtă prezentare generală a cadrului

Quarkus este un Java subatomic supersonic. Scurtă prezentare generală a cadrului

Introducere

Pe XNUMX martie, RedHat (în curând IBM) prezentat cadru nou - quarkus. Potrivit dezvoltatorilor, acest cadru se bazează pe GraalVM și OpenJDK HotSpot și este conceput pentru Kubernetes. Stack-ul Quarkus include: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus și altele.

Scopul este de a face din Java platforma lider pentru implementarea Kubernetes și dezvoltarea de aplicații fără server, oferind dezvoltatorilor o abordare unificată a dezvoltării atât în ​​stiluri reactive, cât și imperative.

Daca te uiti la acest clasificarea cadrelor, atunci Quarkus este undeva între „Agregatori/Generatoare de cod” și „Frame fullstack de nivel înalt”. Acesta este deja mai mult decât un agregator, dar nici măcar nu ajunge la full-stack, pentru că... adaptate pentru dezvoltarea backend.

Se promit viteză foarte mare de lansare a aplicației și consum redus de memorie. Iată datele de pe site-ul dezvoltatorului:

Timp de la început până la primul răspuns(e):

configurație
REST
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Stivă nativă tradițională în cloud*
4.3
9.5

Consum de memorie (Mb):

configurație
REST
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Stivă nativă tradițională în cloud*
140
218

Impresionant, nu-i așa?

*Nu am găsit nicio informație despre această stivă de tehnologie, putem presupune că acesta este un fel de Spring Boot cu un kit suplimentar pentru caroserie.

Salut Lume!

Cea mai simplă aplicație scrisă în Quarkus ar arăta astfel:

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

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

Este literalmente o singură clasă și este suficient! Puteți rula aplicația folosind Maven în modul de dezvoltare:

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

Diferența față de o aplicație obișnuită este că nu există o clasă de aplicație! Quarkus acceptă reîncărcare la cald, astfel încât să vă puteți schimba aplicația fără a o reporni, făcând dezvoltarea și mai rapidă.

Ce urmeaza? Puteți adăuga un serviciu la un controler folosind o adnotare Injecta. Cod serviciu:

@ApplicationScoped
public class GreetingService {

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

Controlor:

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

Rețineți că Quarkus utilizează adnotări standard din cadre familiare - CDI și JAX-RS. Nu este nevoie să înveți ceva nou dacă ai lucrat înainte cu CDI și JAX-RS, desigur.

Lucrul cu baza de date

Sunt utilizate adnotări Hibernate și JPA standard pentru entități. Ca și în cazul controlerelor REST, trebuie să scrieți un minim de cod. Este suficient să indicați dependențele în fișierul de asamblare, adăugați adnotări @Entity și configurați sursa de date în application.properties.

Toate. Fără fișiere sessionFactory, persistence.xml sau alte servicii. Scriem doar codul necesar. Cu toate acestea, dacă este necesar, puteți crea un fișier persistence.xml și puteți configura stratul ORM mai fin.

Quarkus acceptă stocarea în cache a entităților, colecții pentru relații unu-la-mai multe și interogări. La prima vedere arată grozav, dar este local stocarea în cache, pentru un nod Kubernetes. Acestea. Cache-urile diferitelor noduri nu sunt sincronizate între ele. Sper că acest lucru este temporar.

Executarea codului asincron

După cum am menționat mai sus, Quarkus acceptă și stilul de programare reactivă. Codul aplicației anterioare poate fi scris într-o formă diferită.

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

Codul asincron poate fi, de asemenea, transferat la serviciu, rezultatul va fi același.

Testarea

Testele pentru aplicațiile Quarkus pot fi scrise în JUnit4 sau JUnit5. Mai jos este un exemplu de test pentru un punct final, este scris folosind RestAssured, dar poate fi folosit un alt cadru:

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

Adnotarea @QuarkusTest vă indică să rulați aplicația înainte de a rula teste. Restul este un cod familiar tuturor dezvoltatorilor.

Aplicație specifică platformei

Deoarece Quarkus este strâns integrat cu GraalVM, este desigur posibil să se genereze cod specific platformei. Pentru a face acest lucru, trebuie să instalați GraalVM și să specificați variabila de mediu GRAALVM_HOME. Mai departe înregistrați un profil pentru asamblare și specificați-l când construiți aplicația:

mvn package -Pnative

Interesant este că aplicația generată poate fi testată. Și acest lucru este important deoarece execuția codului nativ poate diferi de execuția pe JVM. Adnotarea @SubstrateTest rulează cod de aplicație specific platformei. Reutilizarea codului de testare existent se poate face folosind moștenirea; ca rezultat, codul pentru testarea unei aplicații dependente de platformă va arăta astfel:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Imaginea generată poate fi ambalată în Docker și rulată în Kubernetes sau OpenShift, descrisă în detaliu în instrucțiuni.

unelte

Cadrul Quarkus poate fi folosit cu Maven și Gradle. Maven este pe deplin acceptat, spre deosebire de Gradle. Din păcate, momentan Gradle nu acceptă generarea unui proiect gol; există informații detaliate pe site manualul.

expansiune

Quarkus este un cadru extensibil. Momentan există o comandă 40 de extensii, care adaugă diverse funcționalități - de la suport Recipient cu arc DI и Camila Apache înainte de a înregistra și de a publica valorile pentru rularea serviciilor. Și există deja o extensie pentru a sprijini scrierea aplicațiilor în Kotlin, pe lângă Java.

Concluzie

În opinia mea, Quarkus este destul de în acord cu tendințele vremii. Dezvoltarea codului backend devine din ce în ce mai ușoară, iar acest cadru simplifică și accelerează și mai mult dezvoltarea serviciilor prin adăugarea de suport nativ pentru Docker și Kubernetes. Un avantaj uriaș este suportul încorporat pentru GraalVM și generarea de imagini dependente de platformă, care permite serviciilor să pornească foarte rapid și să ocupe puțin spațiu de memorie. Și acest lucru este foarte important în timpul nostru de pasiune în masă pentru microservicii și arhitectura serverless.

Site-ul oficial - quarkus.io. Exemple de proiecte pentru o pornire rapidă sunt deja disponibile pe GitHub.

Sursa: www.habr.com

Adauga un comentariu