Enkonduko
La XNUMX-an de marto, RedHat (baldaŭ IBM)
La celo estas igi Javan la gvida platformo por Kubernetes-deplojo kaj senservila aplikaĵo-disvolviĝo, provizante al programistoj unuigitan aliron al evoluo en ambaŭ reaktivaj kaj nepraj stiloj.
Se vi rigardas
Tre alta rapideco de lanĉo de aplikaĵo kaj malalta memorkonsumo estas promesitaj. Jen la datumoj de la retejo de la programisto:
Tempo de komenco ĝis unua(j) respondo(j):
Agordo
RESTA
REST+JPA
Quarkus+GraalVM
0.014
0.055
Quarkus+OpenJDK
0.75
2.5
Tradicia Nuba Indiĝena Stako*
4.3
9.5
Memorkonsumo (Mb):
Agordo
RESTA
REST+JPA
Quarkus+GraalVM
13
35
Quarkus+OpenJDK
74
130
Tradicia Nuba Indiĝena Stako*
140
218
Imprese, ĉu ne?
*Mi ne trovis ajnan informon pri ĉi tiu teknologia stako, ni povas supozi, ke ĉi tio estas ia Printempa Boto kun plia korpokompleto..
Saluton mondo!
La plej simpla aplikaĵo skribita en Quarkus aspektus jene:
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
}
Ĝi estas laŭvorte unu klaso kaj tio sufiĉas! Vi povas ruli la aplikaĵon uzante Maven en disvolva reĝimo:
mvn compile quarkus:dev
…
$ curl http://localhost:8080/hello
hello
La diferenco de regula aplikaĵo estas, ke ne ekzistas Aplika klaso! Quarkus subtenas varman reŝargon, do vi povas ŝanĝi vian aplikaĵon sen rekomenci ĝin, igante disvolviĝon eĉ pli rapida.
Kio sekvas? Vi povas aldoni servon al regilo per komentario
@ApplicationScoped
public class GreetingService {
public String greeting(String name) {
return "Hello " + name + "!";
}
}
Regilo:
@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!
Notu, ke Quarkus uzas normajn komentadojn de konataj kadroj - CDI kaj JAX-RS. Ne necesas lerni ion novan se vi jam antaŭe laboris kun CDI kaj JAX-RS, kompreneble.
Laborante kun la datumbazo
Hibernate kaj normaj JPA komentarioj por entoj estas uzataj. Kiel ĉe REST-regiloj, vi devas skribi minimumon da kodo. Sufiĉas indiki la dependecojn en la asemblea dosiero, aldoni komentariojn @Entity
kaj agordi datumfonton en application.properties.
Ĉiuj. Neniu sessionFactory, persistence.xml aŭ aliaj servodosieroj. Ni skribas nur la kodon kiu estas bezonata. Tamen, se necese, vi povas krei persistence.xml dosieron kaj agordi la ORM-tavolon pli fajne.
Quarkus subtenas kaŝmemoron de entoj, kolektoj por unu-al-multaj rilatoj kaj demandoj. Unuavide ĝi aspektas bonega, sed ĝi estas loka kaŝmemoro, por unu Kubernetes nodo. Tiuj. La kaŝmemoroj de malsamaj nodoj ne estas sinkronigitaj unu kun la alia. Mi esperas, ke ĉi tio estas provizora.
Nesinkrona koda ekzekuto
Kiel menciite supre, Quarkus ankaŭ subtenas la reaktivan programstilon. La kodo de la antaŭa aplikaĵo povas esti skribita en malsama formo.
@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 + "!";
});
}
}
Nesinkrona kodo ankaŭ povas esti translokigita al la servo, la rezulto estos la sama.
Testado
Testoj por Quarkus-aplikoj povas esti skribitaj en JUnit4 aŭ JUnit5. Malsupre estas ekzempla testo por finpunkto, ĝi estas skribita per RestAssured, sed alia kadro povas esti uzata:
@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 + "!"));
}
}
La komentario @QuarkusTest instrukcias vin ruli la aplikaĵon antaŭ ol fari testojn. La resto estas kodo konata al ĉiuj programistoj.
Platform-specifa aplikaĵo
Ĉar Quarkus estas forte integrita kun GraalVM, kompreneble eblas generi platform-specifan kodon. Por fari tion, vi devas instali GraalVM kaj specifi la mediovariablon GRAALVM_HOME. Plue
mvn package -Pnative
Interese, la generita aplikaĵo povas esti provita. Kaj ĉi tio estas grava ĉar la ekzekuto de indiĝena kodo povas diferenci de ekzekuto sur la JVM. La komentario @SubstrateTest rulas platform-specifan aplikaĵokodon. Reuzi ekzistantan testkodon povas esti farita uzante heredon; kiel rezulto, la kodo por testi platform-dependan aplikaĵon aspektos jene:
@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {
}
La generita bildo povas esti enpakita en Docker kaj ruliĝi en Kubernetes aŭ OpenShift, priskribitaj detale en
Ilaro
La Quarkus-kadro povas esti uzata kun Maven kaj Gradle. Maven estas plene subtenata, male al Gradle. Bedaŭrinde, nuntempe Gradle ne subtenas generi malplenan projekton; estas detalaj informoj en la retejo.
Etendoj
Quarkus estas etendebla kadro. Nuntempe estas mendo
konkludo
Laŭ mi, Quarkus sufiĉe konformas al la tiamaj tendencoj. Disvolviĝo de malantaŭa kodo fariĝas pli facila kaj pli facila, kaj ĉi tiu kadro pli simpligas kaj akcelas servo-disvolviĝon aldonante denaskan subtenon por Docker kaj Kubernetes. Grandega pluso estas la enkonstruita subteno por GraalVM kaj la generacio de platform-dependaj bildoj, kio permesas al servoj komenci vere rapide kaj okupi malmulte da memorspaco. Kaj ĉi tio estas tre grava en nia tempo de amasa pasio por mikroservoj kaj senservila arkitekturo.
Oficiala retejo -
fonto: www.habr.com