Quarkus ir virsskaņas subatomiskā Java. Īss ietvara pārskats

Quarkus ir virsskaņas subatomiskā Java. Īss ietvara pārskats

Ievads

XNUMX. martā RedHat (drīzumā IBM) uzrādīts jauns ietvars - Kvarkuss. Pēc izstrādātāju domām, šī sistēma ir balstīta uz GraalVM un OpenJDK HotSpot un ir paredzēta Kubernetes. Quarkus kaudze ietver: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus un citus.

Mērķis ir padarīt Java par vadošo platformu Kubernetes izvietošanai un bezserveru lietojumprogrammu izstrādei, nodrošinot izstrādātājiem vienotu pieeju izstrādei gan reaktīvā, gan obligātajā stilā.

Ja paskatās šis ietvaru klasifikāciju, tad Quarkus atrodas kaut kur starp “Aggregators/Code Generators” un “High-level fullstack frameworks”. Tas jau ir vairāk nekā apkopotājs, taču tas pat nesasniedz pilnu steku, jo... pielāgota aizmugursistēmas attīstībai.

Tiek solīts ļoti liels lietojumprogrammu palaišanas ātrums un mazs atmiņas patēriņš. Šeit ir dati no izstrādātāja vietnes:

Laiks no sākuma līdz pirmajai atbildei(-ēm):

Konfigurācija
ATPŪTA
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Tradicionālā Cloud Native Stack*
4.3
9.5

Atmiņas patēriņš (Mb):

Konfigurācija
ATPŪTA
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Tradicionālā Cloud Native Stack*
140
218

Iespaidīgi, vai ne?

*Es neatradu nekādu informāciju par šo tehnoloģiju komplektu, varam pieņemt, ka tas ir kaut kāds Spring Boot ar papildu korpusa komplektu.

Sveika pasaule!

Vienkāršākā Quarkus rakstītā lietojumprogramma izskatītos šādi:

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

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

Tā ir burtiski viena klase un ar to pietiek! Programmu var palaist, izmantojot Maven izstrādes režīmā:

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

Atšķirība no parastās aplikācijas ir tāda, ka nav Pieteikumu klases! Quarkus atbalsta karsto pārlādēšanu, lai jūs varētu mainīt savu lietojumprogrammu, to nerestartējot, padarot izstrādi vēl ātrāku.

Ko tālāk? Pakalpojumu kontrolierim var pievienot, izmantojot anotāciju Injicē. Pakalpojuma kods:

@ApplicationScoped
public class GreetingService {

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

Kontrolieris:

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

Ņemiet vērā, ka Quarkus izmanto standarta anotācijas no pazīstamiem ietvariem - CDI un JAX-RS. Protams, nekas jauns nav jāapgūst, ja iepriekš esat strādājis ar CDI un JAX-RS.

Darbs ar datu bāzi

Entītijām tiek izmantotas hibernācijas un standarta JPA anotācijas. Tāpat kā ar REST kontrolieriem, jums ir jāraksta minimālais kods. Pietiek norādīt atkarības montāžas failā, pievienot anotācijas @Entity un konfigurēt datu avotu aplikācijā.properties.

Visi. Nav sessionFactory, persistence.xml vai citu pakalpojumu failu. Mēs rakstām tikai nepieciešamo kodu. Tomēr, ja nepieciešams, varat izveidot failu persistence.xml un precīzāk konfigurēt ORM slāni.

Quarkus atbalsta entītiju saglabāšanu kešatmiņā, kolekcijas relācijām viens pret daudziem un vaicājumus. No pirmā acu uzmetiena tas izskatās lieliski, bet tā tas ir vietējais kešatmiņa, vienam Kubernetes mezglam. Tie. Dažādu mezglu kešatmiņas netiek sinhronizētas viena ar otru. Es ceru, ka tas ir īslaicīgi.

Asinhronā koda izpilde

Kā minēts iepriekš, Quarkus atbalsta arī reaktīvo programmēšanas stilu. Iepriekšējā pieteikuma kodu var rakstīt citā 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 + "!";
       });
   }
}

Servisam var pārsūtīt arī asinhrono kodu, rezultāts būs tāds pats.

Testēšana

Quarkus lietojumprogrammu testus var rakstīt JUnit4 vai JUnit5. Tālāk ir sniegts beigu punkta testa piemērs, tas ir uzrakstīts, izmantojot RestAssured, taču var izmantot citu sistēmu:

@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 anotācija liek jums palaist lietojumprogrammu pirms testu veikšanas. Pārējais ir kods, kas ir pazīstams visiem izstrādātājiem.

Platformai specifiska lietojumprogramma

Tā kā Quarkus ir cieši integrēts ar GraalVM, protams, ir iespējams ģenerēt platformai specifisku kodu. Lai to izdarītu, jāinstalē GraalVM un jānorāda vides mainīgais GRAALVM_HOME. Tālāk reģistrēt profilu montāžai un norādiet to, veidojot lietojumprogrammu:

mvn package -Pnative

Interesanti, ka ģenerēto aplikāciju var pārbaudīt. Un tas ir svarīgi, jo vietējā koda izpilde var atšķirties no izpildes JVM. @SubstrateTest anotācija palaiž platformai specifisku lietojumprogrammas kodu. Esošā testa koda atkārtotu izmantošanu var veikt, izmantojot mantojumu; rezultātā no platformas atkarīgas lietojumprogrammas testēšanas kods izskatīsies šādi:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Ģenerēto attēlu var iepakot programmā Docker un palaist programmā Kubernetes vai OpenShift, kas detalizēti aprakstīts instrukcijas.

Rīkkopa

Quarkus ietvaru var izmantot kopā ar Maven un Gradle. Maven ir pilnībā atbalstīts, atšķirībā no Gradle. Diemžēl šobrīd Gradle neatbalsta tukša projekta ģenerēšanu, mājaslapā ir pieejama detalizēta informācija mācību grāmata.

Paplašinājumi

Quarkus ir paplašināms karkass. Šobrīd ir pasūtījums 40 paplašinājumi, kas pievieno dažādu funkcionalitāti - no atbalsta Atsperu DI konteiners и Apache kamielis pirms reģistrēšanas un metrikas publicēšanas pakalpojumu palaišanai. Un jau ir paplašinājums, kas papildus Java atbalsta lietojumprogrammu rakstīšanu Kotlinā.

Secinājums

Manuprāt, Quarkus diezgan atbilst tā laika tendencēm. Aizmugursistēmas koda izstrāde kļūst arvien vienkāršāka, un šī sistēma vēl vairāk vienkāršo un paātrina pakalpojumu izstrādi, pievienojot vietējo atbalstu Docker un Kubernetes. Milzīgs pluss ir iebūvētais GraalVM atbalsts un no platformas atkarīgu attēlu ģenerēšana, kas ļauj pakalpojumiem sākt patiešām ātri un aizņem maz vietas atmiņā. Un tas ir ļoti svarīgi mūsu laikā, kad valda liela aizraušanās ar mikropakalpojumiem un arhitektūru bez serveriem.

Oficiālā vietne - quarkus.io. Projektu piemēri ātrai sākšanai jau ir pieejami vietnē GitHub.

Avots: www.habr.com

Pievieno komentāru