Quarkus yog supersonic subatomic Java. Cov ntsiab lus luv luv ntawm lub moj khaum

Quarkus yog supersonic subatomic Java. Cov ntsiab lus luv luv ntawm lub moj khaum

Taw qhia

Thaum Lub Peb Hlis XNUMXth, RedHat (tsis ntev IBM) рСдставила lub moj khaum tshiab - quarkus. Raws li cov neeg tsim khoom, lub moj khaum no yog raws li GraalVM thiab OpenJDK HotSpot thiab yog tsim los rau Kubernetes. Cov pawg Quarkus suav nrog: JPA / Hibernate, JAX-RS / RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus thiab lwm yam.

Lub hom phiaj yog ua kom Java ua tus thawj coj platform rau Kubernetes xa mus thiab serverless daim ntawv thov kev txhim kho, muab cov neeg tsim khoom nrog kev sib koom ua ke rau kev txhim kho hauv ob qho tib si reactive thiab tseem ceeb.

Yog koj saib qhov no Kev faib tawm ntawm lub moj khaum, tom qab ntawd Quarkus yog qhov chaw ntawm "Aggregators / Code Generators" thiab "High-theem fullstack moj khaum". Qhov no twb muaj ntau tshaj li qhov sib sau ua ke, tab sis nws tsis txawm mus txog tag nrho pawg, vim ... haum rau kev txhim kho backend.

Kev kub ceev heev ntawm daim ntawv thov tso tawm thiab tsis nco qab tau cog lus tseg. Nov yog cov ntaub ntawv los ntawm tus tsim tawm lub vev xaib:

Lub sij hawm txij thaum pib mus rau thawj cov lus teb (s):

Configuration
SO
REST + JPA

Quarkus + GraalVM
0.014
0.055

Quarkus + OpenJDK
0.75
2.5

Traditional Cloud Native Stack *
4.3
9.5

Kev siv lub cim xeeb (Mb):

Configuration
SO
REST + JPA

Quarkus + GraalVM
13
35

Quarkus + OpenJDK
74
130

Traditional Cloud Native Stack *
140
218

Txaus siab heev, puas yog?

*Kuv tsis tau pom cov ntaub ntawv hais txog cov txheej txheem thev naus laus zis no, peb tuaj yeem xav tias qhov no yog qee yam Spring Boot nrog cov khoom siv lub cev ntxiv..

Nyob zoo lub ntiaj teb no!

Daim ntawv thov yooj yim tshaj plaws sau hauv Quarkus yuav zoo li no:

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

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

Nws yog lus ib chav kawm thiab qhov txaus! Koj tuaj yeem khiav daim ntawv thov siv Maven hauv hom kev txhim kho:

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

Qhov txawv ntawm daim ntawv thov tsis tu ncua yog tias tsis muaj Daim Ntawv Thov Chav Kawm! Quarkus txhawb nqa kub reload, yog li koj tuaj yeem hloov koj daim ntawv thov yam tsis tau rov pib dua, ua rau kev txhim kho sai dua.

Tom ntej no yog dab tsi? Koj tuaj yeem ntxiv ib qho kev pabcuam rau tus maub los siv cov lus piav qhia Txhaj. Service code:

@ApplicationScoped
public class GreetingService {

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

Controller:

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

Nco ntsoov tias Quarkus siv cov lus piav qhia tus qauv los ntawm cov txheej txheem paub - CDI thiab JAX-RS. Tsis tas yuav kawm dab tsi tshiab yog tias koj tau ua haujlwm nrog CDI thiab JAX-RS ua ntej, tau kawg.

Ua haujlwm nrog database

Hibernate thiab standard JPA annotations rau cov koom haum yog siv. Raws li nrog REST controllers, koj yuav tsum sau qhov tsawg kawg nkaus ntawm cov cai. Nws yog txaus los qhia qhov kev vam khom nyob rau hauv cov ntaub ntawv sib dhos, ntxiv annotations @Entity thiab configure datasource hauv application.properties.

Tag nrho. Tsis muaj sessionFactory, persistence.xml lossis lwm cov ntaub ntawv pabcuam. Peb tsuas yog sau tus lej uas xav tau. Txawm li cas los xij, yog tias tsim nyog, koj tuaj yeem tsim cov ntaub ntawv persistence.xml thiab teeb tsa ORM txheej kom zoo dua.

Quarkus txhawb nqa caching ntawm cov chaw, sau rau ib-rau-ntau qhov kev sib raug zoo, thiab cov lus nug. Thaum xub thawj siab ib muag nws zoo heev, tab sis nws yog hauv zos caching, rau ib Kubernetes node. Cov. Lub caches ntawm cov nodes sib txawv tsis synchronized nrog ib leeg. Kuv vam tias qhov no yog ib ntus.

Asynchronous code ua haujlwm

Raws li tau hais los saum toj no, Quarkus kuj txhawb nqa cov txheej txheem reactive. Cov cai ntawm daim ntawv thov dhau los tuaj yeem sau rau hauv ib daim ntawv sib txawv.

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

Asynchronous code kuj tuaj yeem hloov mus rau qhov kev pabcuam, qhov tshwm sim yuav zoo ib yam.

Kev Ntsuam Xyuas

Cov ntawv xeem rau Quarkus tuaj yeem sau rau hauv JUnit4 lossis JUnit5. Hauv qab no yog ib qho piv txwv rau qhov kawg, nws yog sau siv RestAssured, tab sis lwm lub moj khaum siv tau:

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

Lub @QuarkusTest annotation qhia koj kom khiav daim ntawv thov ua ntej kev xeem. Tus so yog code paub rau txhua tus tsim tawm.

Kev siv lub platform tshwj xeeb

Txij li Quarkus tau nruj ua ke nrog GraalVM, nws yog qhov tseeb ua tau los tsim cov cai tshwj xeeb platform. Txhawm rau ua qhov no, koj yuav tsum nruab GraalVM thiab qhia meej qhov GRAALVM_HOME ib puag ncig hloov pauv. Ntxiv mus sau npe profile rau kev sib dhos thiab qhia nws thaum tsim daim ntawv thov:

mvn package -Pnative

Interestingly, daim ntawv thov generated yuav raug kuaj. Thiab qhov no yog qhov tseem ceeb vim tias kev ua tiav ntawm haiv neeg cov cai yuav txawv ntawm kev ua tiav ntawm JVM. Cov lus piav qhia @SubstrateTest khiav lub platform tshwj xeeb daim ntawv thov code. Kev rov siv cov lej xeem uas twb muaj lawm tuaj yeem ua tiav siv qhov qub txeeg qub teg; vim li ntawd, cov cai rau kev sim cov ntawv thov platform-dependent yuav zoo li no:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Cov duab tsim tau tuaj yeem ntim rau hauv Docker thiab khiav hauv Kubernetes lossis OpenShift, piav qhia meej hauv cov lus qhia.

Cov Cuab Yeej Siv

Quarkus lub moj khaum tuaj yeem siv nrog Maven thiab Gradle. Maven tau txais kev txhawb siab, tsis zoo li Gradle. Hmoov tsis zoo, tam sim no Gradle tsis txhawb tsim qhov project khoob; muaj cov ncauj lus kom ntxaws ntawm lub vev xaib phau ntawv nyeem.

Kev txuas ntxiv

Quarkus yog lub moj khaum txuas ntxiv. Tam sim no muaj kev txiav txim 40 extensions, uas ntxiv ntau yam kev ua haujlwm - los ntawm kev txhawb nqa Spring DI thawv ΠΈ Apache Camel ua ntej txiav thiab luam tawm cov ntsuas rau kev khiav haujlwm. Thiab twb muaj qhov txuas ntxiv los txhawb kev sau ntawv hauv Kotlin, ntxiv rau Java.

xaus

Nyob rau hauv kuv lub tswv yim, Quarkus yog heev nyob rau hauv txoj kab nrog cov tiam sis ntawm lub sij hawm. Backend code txoj kev txhim kho tau yooj yim dua thiab yooj yim dua, thiab lub moj khaum no ua kom yooj yim dua thiab ua kom cov kev pab cuam sai dua los ntawm kev ntxiv cov kev txhawb nqa rau Docker thiab Kubernetes. Ib qho ntxiv loj yog qhov txhawb nqa rau GraalVM thiab tiam ntawm cov duab nyob ntawm lub platform, uas tso cai rau cov kev pabcuam pib sai sai thiab siv qhov chaw nco me me. Thiab qhov no tseem ceeb heev nyob rau hauv peb lub sij hawm ntawm huab hwm coj mob siab rau microservices thiab serverless architecture.

Official site - qus.io. Piv txwv ntawm tej yaam num rau kev pib ceev twb muaj nyob rau GitHub.

Tau qhov twg los: www.hab.com

Ntxiv ib saib