Quarkus je supersonična subatomska Java. Kratak pregled okvira

Quarkus je supersonična subatomska Java. Kratak pregled okvira

Uvod

XNUMX. marta, RedHat (uskoro IBM) predstavljen novi okvir - quarkus. Prema rečima programera, ovaj okvir je zasnovan na GraalVM-u i OpenJDK HotSpot-u i dizajniran je za Kubernetes. Quarkus stack uključuje: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus i druge.

Cilj je da Java postane vodeća platforma za primenu Kubernetesa i razvoj aplikacija bez servera, pružajući programerima jedinstven pristup razvoju u reaktivnim i imperativnim stilovima.

Gledam ovo klasifikacija okvira, onda je Quarkus negdje između “agregatora/generatora koda” i “high-level fullstack frameworka”. Ovo je već više od agregatora, ali čak ni ne dostiže puni stack, jer... skrojen za backend razvoj.

Obećana je vrlo velika brzina pokretanja aplikacije i mala potrošnja memorije. Evo podataka sa web stranice programera:

Vrijeme od početka do prvog odgovora (s):

Konfiguracija
REST
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Tradicionalni Cloud izvorni stog*
4.3
9.5

Potrošnja memorije (Mb):

Konfiguracija
REST
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Tradicionalni Cloud izvorni stog*
140
218

Impresivno, zar ne?

*Nisam pronašao nikakve informacije o ovoj tehnologiji, možemo pretpostaviti da je ovo neka vrsta Spring Boot-a sa dodatnim body kitom.

Hello World!

Najjednostavnija aplikacija napisana u Quarkusu bi izgledala ovako:

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

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

To je bukvalno jedan čas i to je dovoljno! Aplikaciju možete pokrenuti koristeći Maven u razvojnom modu:

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

Razlika od obične aplikacije je u tome što ne postoji klasa aplikacije! Quarkus podržava ponovno učitavanje, tako da možete promijeniti svoju aplikaciju bez ponovnog pokretanja, čineći razvoj još bržim.

Šta je sledeće? Možete dodati uslugu kontroleru pomoću napomene Injektirati. Servisni kod:

@ApplicationScoped
public class GreetingService {

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

Kontroler:

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

Imajte na umu da Quarkus koristi standardne napomene iz poznatih okvira - CDI i JAX-RS. Nema potrebe učiti ništa novo ako ste ranije radili sa CDI i JAX-RS, naravno.

Rad sa bazom podataka

Koriste se hibernacije i standardne JPA napomene za entitete. Kao i kod REST kontrolera, morate napisati minimum koda. Dovoljno je naznačiti zavisnosti u datoteci sklopa, dodati napomene @Entity i konfigurirajte izvor podataka u aplikaciji.properties.

Sve. Nema sessionFactory, persistence.xml ili drugih servisnih datoteka. Pišemo samo onaj kod koji je potreban. Međutim, ako je potrebno, možete kreirati datoteku persistence.xml i finije konfigurirati ORM sloj.

Quarkus podržava keširanje entiteta, kolekcije za odnose jedan prema više i upite. Na prvi pogled izgleda odlično, ali tako je lokalno keširanje, za jedan Kubernetes čvor. One. Keš memorije različitih čvorova nisu međusobno sinkronizirane. Nadam se da je ovo privremeno.

Asinkrono izvršavanje koda

Kao što je gore pomenuto, Quarkus takođe podržava reaktivni stil programiranja. Šifra prethodne aplikacije može se napisati u drugom obliku.

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

Asinhroni kod se također može prenijeti na servis, rezultat će biti isti.

Testiranje

Testovi za Quarkus aplikacije mogu biti napisani u JUnit4 ili JUnit5. Ispod je primjer testa za krajnju tačku, napisan je koristeći RestAssured, ali se može koristiti i drugi okvir:

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

Napomena @QuarkusTest upućuje vas da pokrenete aplikaciju prije pokretanja testova. Ostalo je kod poznat svim programerima.

Aplikacija specifična za platformu

Budući da je Quarkus čvrsto integriran sa GraalVM-om, naravno moguće je generirati specifičan kod za platformu. Da biste to učinili, trebate instalirati GraalVM i navesti varijablu okruženja GRAALVM_HOME. Dalje registrirajte profil za montažu i navedite ga prilikom izrade aplikacije:

mvn package -Pnative

Zanimljivo je da se generirana aplikacija može testirati. A ovo je važno jer se izvršavanje izvornog koda može razlikovati od izvršavanja na JVM-u. @SubstrateTest napomena pokreće kod aplikacije specifičan za platformu. Ponovno korištenje postojećeg testnog koda može se obaviti korištenjem nasljeđivanja; kao rezultat toga, kod za testiranje aplikacije zavisne od platforme će izgledati ovako:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Generirana slika se može upakovati u Docker i pokrenuti u Kubernetes ili OpenShift, detaljno opisano u uputstva.

Toolkit

Quarkus okvir se može koristiti sa Maven i Gradle. Maven je u potpunosti podržan, za razliku od Gradlea. Nažalost, u ovom trenutku Gradle ne podržava generiranje praznog projekta; detaljne informacije postoje na web stranici udžbenik.

Extensions

Quarkus je proširivi okvir. Trenutno postoji narudžba 40 ekstenzija, koji dodaju različite funkcionalnosti - od podrške Opružni DI kontejner и Apache Camel prije evidentiranja i objavljivanja metrike za pokrenute usluge. I već postoji proširenje koje podržava pisanje aplikacija u Kotlinu, pored Jave.

zaključak

Po mom mišljenju, Quarkus je sasvim u skladu sa trendovima tog vremena. Razvoj pozadinskog koda postaje sve lakši i lakši, a ovaj okvir dodatno pojednostavljuje i ubrzava razvoj usluga dodavanjem izvorne podrške za Docker i Kubernetes. Ogroman plus je ugrađena podrška za GraalVM i generiranje slika zavisnih od platforme, što omogućava da se servisi počnu vrlo brzo i zauzimaju malo memorijskog prostora. A ovo je veoma važno u našem vremenu masovne strasti za mikroservisima i arhitekturom bez servera.

Zvanična stranica - quarkus.io. Primjeri projekata za brzi početak su već dostupni na GitHub.

izvor: www.habr.com

Dodajte komentar