Java isatomig uwchsonig yw Quarkus. Trosolwg byr o'r fframwaith

Java isatomig uwchsonig yw Quarkus. Trosolwg byr o'r fframwaith

Cyflwyniad

Ar Fawrth XNUMX, RedHat (IBM yn fuan) wedi'i gyflwyno fframwaith newydd - Cwarcws. Yn Γ΄l y datblygwyr, mae'r fframwaith hwn yn seiliedig ar GraalVM ac OpenJDK HotSpot ac wedi'i gynllunio ar gyfer Kubernetes. Mae pentwr Quarkus yn cynnwys: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus ac eraill.

Y nod yw gwneud Java yn brif lwyfan ar gyfer defnyddio Kubernetes a datblygu cymwysiadau heb weinydd, gan ddarparu dull unedig i ddatblygwyr o ddatblygu mewn arddulliau adweithiol a hanfodol.

Os edrychwch ar hyn dosbarthiad fframweithiau, yna mae Quarkus rhywle rhwng β€œAgregators/Code Generators” a β€œHigh-level full stac-frames”. Mae hyn eisoes yn fwy na chyfunwr, ond nid yw hyd yn oed yn cyrraedd pentwr llawn, oherwydd... wedi'i deilwra ar gyfer datblygu cefn.

Addewir cyflymder uchel iawn o lansio cais a defnydd cof isel. Dyma'r data o wefan y datblygwr:

Amser o'r dechrau i'r ymateb(ion):

Ffurfweddiad
REST
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+JDK Agored
0.75
2.5

Stack Brodorol Cwmwl Traddodiadol*
4.3
9.5

Defnydd cof (Mb):

Ffurfweddiad
REST
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+JDK Agored
74
130

Stack Brodorol Cwmwl Traddodiadol*
140
218

Yn drawiadol, ynte?

*Ni wnes i ddod o hyd i unrhyw wybodaeth am y pentwr technoleg hwn, gallwn gymryd yn ganiataol mai rhyw fath o Spring Boot yw hwn gyda phecyn corff ychwanegol.

Helo Byd!

Byddai'r cais symlaf a ysgrifennwyd yn Quarkus yn edrych fel hyn:

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

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

Yn llythrennol mae'n un dosbarth a dyna ddigon! Gallwch chi redeg y rhaglen gan ddefnyddio Maven yn y modd datblygu:

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

Y gwahaniaeth o gais rheolaidd yw nad oes dosbarth Cais! Mae Quarkus yn cefnogi ail-lwytho poeth, felly gallwch chi newid eich cais heb ei ailgychwyn, gan wneud datblygiad hyd yn oed yn gyflymach.

Beth sydd nesaf? Gallwch ychwanegu gwasanaeth at reolydd gan ddefnyddio anodiad Chwistrellwch. Cod gwasanaeth:

@ApplicationScoped
public class GreetingService {

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

Rheolydd:

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

Sylwch fod Quarkus yn defnyddio anodiadau safonol o fframweithiau cyfarwydd - CDI a JAX-RS. Nid oes angen dysgu unrhyw beth newydd os ydych wedi gweithio gyda CDI a JAX-RS o'r blaen, wrth gwrs.

Gweithio gyda'r gronfa ddata

Defnyddir anodiadau JPA safonol a gaeafgysgu ar gyfer endidau. Fel gyda rheolwyr REST, mae angen i chi ysgrifennu isafswm o god. Mae'n ddigon i nodi'r dibyniaethau yn y ffeil cydosod, ychwanegu anodiadau @Entity a ffurfweddu ffynhonnell ddata yn application.properties.

I gyd. Dim sesiwnFactory, persistence.xml na ffeiliau gwasanaeth eraill. Rydym yn ysgrifennu dim ond y cod sydd ei angen. Fodd bynnag, os oes angen, gallwch greu ffeil persistence.xml a ffurfweddu'r haen ORM yn fwy manwl.

Mae Quarkus yn cefnogi storio endidau, casgliadau ar gyfer perthnasoedd un i lawer, ac ymholiadau. Ar yr olwg gyntaf mae'n edrych yn wych, ond mae'n lleol caching, am un nod Kubernetes. Y rhai. Nid yw caches gwahanol nodau wedi'u cydamseru Γ’'i gilydd. Rwy'n gobeithio mai dros dro yw hyn.

Gweithredu cod asyncronig

Fel y soniwyd uchod, mae Quarkus hefyd yn cefnogi'r arddull rhaglennu adweithiol. Gellir ysgrifennu cod y cais blaenorol mewn ffurf wahanol.

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

Gellir trosglwyddo cod asyncronig i'r gwasanaeth hefyd, bydd y canlyniad yr un peth.

Profi

Gellir ysgrifennu profion ar gyfer ceisiadau Quarkus yn JUnit4 neu JUnit5. Isod mae prawf enghreifftiol ar gyfer diweddbwynt, mae wedi'i ysgrifennu gan ddefnyddio RestAssured, ond gellir defnyddio fframwaith arall:

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

Mae anodiad @QuarkusTest yn eich cyfarwyddo i redeg y rhaglen cyn rhedeg profion. Mae'r gweddill yn god sy'n gyfarwydd i bob datblygwr.

Cais platfform-benodol

Gan fod Quarkus wedi'i integreiddio'n dynn Γ’ GraalVM, wrth gwrs mae'n bosibl cynhyrchu cod platfform-benodol. I wneud hyn, mae angen i chi osod GraalVM a nodi'r newidyn amgylchedd GRALVM_HOME. Ymhellach cofrestru proffil ar gyfer y cynulliad a'i nodi wrth adeiladu'r cais:

mvn package -Pnative

Yn ddiddorol, gellir profi'r cais a gynhyrchir. Ac mae hyn yn bwysig oherwydd gall gweithredu cod brodorol fod yn wahanol i weithredu ar y JVM. Mae anodiad @SubstrateTest yn rhedeg cod cymhwysiad platfform-benodol. Gellir ailddefnyddio cod prawf presennol gan ddefnyddio etifeddiaeth; o ganlyniad, bydd y cod ar gyfer profi cymhwysiad platfform-ddibynnol yn edrych fel hyn:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Gellir pecynnu'r ddelwedd a gynhyrchir yn Docker a'i rhedeg yn Kubernetes neu OpenShift, a ddisgrifir yn fanwl yn cyfarwyddiadau.

Pecyn cymorth

Gellir defnyddio fframwaith Quarkus gyda Maven a Gradle. Mae Maven yn cael ei gefnogi'n llawn, yn wahanol i Gradle. Yn anffodus, ar hyn o bryd nid yw Gradle yn cefnogi cynhyrchu prosiect gwag; mae gwybodaeth fanwl ar y wefan gwerslyfr.

Estyniadau

Mae Quarkus yn fframwaith estynadwy. Ar hyn o bryd mae gorchymyn 40 estyniad, sy'n ychwanegu swyddogaethau amrywiol - o gefnogaeth Cynhwysydd DI gwanwyn ΠΈ Apache Camel cyn logio a chyhoeddi metrigau ar gyfer rhedeg gwasanaethau. Ac mae estyniad eisoes i gefnogi ysgrifennu cymwysiadau yn Kotlin, yn ogystal Γ’ Java.

Casgliad

Yn fy marn i, mae Quarkus yn hollol unol Γ’ thueddiadau'r amser. Mae datblygu cod backend yn dod yn haws ac yn haws, ac mae'r fframwaith hwn yn symleiddio ac yn cyflymu datblygiad gwasanaeth ymhellach trwy ychwanegu cefnogaeth frodorol i Docker a Kubernetes. Mantais enfawr yw'r gefnogaeth fewnol i GraalVM a chynhyrchu delweddau sy'n dibynnu ar blatfformau, sy'n caniatΓ‘u i wasanaethau ddechrau'n gyflym iawn a chymryd ychydig o le cof. Ac mae hyn yn bwysig iawn yn ein cyfnod o angerdd torfol am ficrowasanaethau a phensaernΓ―aeth ddi-weinydd.

Safle swyddogol - cwarcws.io. Mae enghreifftiau o brosiectau ar gyfer cychwyn cyflym eisoes ar gael ar GitHub.

Ffynhonnell: hab.com

Ychwanegu sylw