áááá«ááºáž
áááºá XNUMX áááºáá±á·ááœáẠRedHat (áááŒá¬áá® IBM)á
áááºááœááºáá»ááºááŸá¬ Java ááᯠKubernetes ááŒáá·áºáá»ááºááŒááºážááŸáá·áº áá¬áá¬áá²á· á¡ááºááºáá®áá±ážááŸááºáž ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á¡ááœáẠááááºáááºážááááºáá±á¬ááºážááŒá áºá á±áááºááŒá áºááŒá®ážá developer áá»á¬ážá¡á¬áž ááŒááºáááºáá¯á¶á·ááŒááºááŸá¯ááŸáá·áº ááá¯á¡ááºáá±á¬áá¯á¶á á¶áá»á¬áž ááŸá áºáá»áá¯ážá áá¯á¶ážááŒáá·áº ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯áá®ááá¯á· áá áºá á¯áá áºá ááºážáááºážáá»ááºážáááºááŸá¯ááᯠáá±ážáá±á¬ááºáááºááŒá áºáááºá
ááŒáá·áºááá¯ááºáááº
á¡ááºááá®áá±ážááŸááºážááᯠá¡ááŸáááºá¡áá¯ááºááŒáá·áºá áœá¬ ááœáŸáá·áºáááºááŒááºážááŸáá·áº áááºááá¯áá®áá¯á¶ážá áœá²ááŸá¯ áááºážáá«ážááŒááºážááá¯á·ááᯠáááááŒá¯áá«áááºá á€áááºááŸá¬ áá±á¬á·ááºáá²áá±ážáá¬ážáá°á áááºááá¯ááºá០áá±áá¬áá»á¬ážááŒá áºáááº-
á¡á á០ááááá¯á¶á·ááŒááºááŸá¯ á¡áá»ááẠ(áá»á¬áž)á
configuration áá»á¬áž
REST
REST+JPA
Quarkus+GraalVM
0.014
0.055
Quarkus+OpenJDK
0.75
2.5
ááá¬ážááá¯ážáá» Cloud Native Stack*
4.3
9.5
ááŸááºáá¬ááºáá¯á¶ážá áœá²ááŸá¯ (Mb)-
configuration áá»á¬áž
REST
REST+JPA
Quarkus+GraalVM
13
35
Quarkus+OpenJDK
74
130
ááá¬ážááá¯ážáá» Cloud Native Stack*
140
218
á¡áááºááŒá®ážá áá¬áá² ááá¯ááºáá¬ážá
*á€áááºážááá¬á¡á á¯á¡áá±ážááŸáá·áºáááºáááºááá·áº á¡áá»ááºá¡áááºááᯠáá»áœááºá¯ááºáááœá±á·áá²á·áá«á áááºážááẠá¡ááá¯áá±á¬ááºážááá¯ááºáááºá¡á á¯á¶áá«ááá·áº Spring Boot áá áºáá»áá¯ážááŒá áºáááºáᯠáá»áœááºá¯ááºááá¯á· áá°áááá¯ááºáá«áááºá.
ááá€áá¬áá«
Quarkus ááœááºáá±ážáá¬ážáá±á¬á¡ááá¯ážááŸááºážáá¯á¶áž application áááºá€áá²á·ááá¯á·ááŒá áºáááá·áºáááºá
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
}
áá áºáááºážáááºážáá²á· áá¯á¶áá±á¬ááºáá«ááŒá®á ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯áá¯ááºááœáẠMaven ááᯠá¡áá¯á¶ážááŒá¯á á¡ááá®áá±ážááŸááºážááᯠááẠrun ááá¯ááºáááº-
mvn compile quarkus:dev
âŠ
$ curl http://localhost:8080/hello
hello
áá¯á¶ááŸááºá¡ááá®áá±ážááŸááºážááŸáá·áº ááœá¬ááŒá¬ážáá»ááºááŸá¬ áá»áŸá±á¬ááºááœáŸá¬á¡áááºážá¡á á¬áž áááŸáááŒááºážáááºááŒá áºáááºá Quarkus ááẠhot reload ááᯠáá¶á·ááá¯ážáá±ážáá±á¬ááŒá±á¬áá·áº áááºážááᯠááŒááºáááºá áááºááŒááºážáááŒá¯áá² ááá·áºá¡ááá®áá±ážááŸááºážááᯠááŒá±á¬ááºážáá²ááá¯ááºááŒá®áž ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááᯠááá¯ááá¯ááŒááºáááºá á±áááºá
áá±á¬ááºáá
áºáá¯ááá¬áá²? ááŸááºáá»ááºáá
áºáá¯áá¯á¶ážááŒá®áž ááááºážáá»á¯ááºáááááá¬ááá¯á· áááºáá±á¬ááºááŸá¯áá
áºáᯠááá·áºááá¯ááºáááºá
@ApplicationScoped
public class GreetingService {
public String greeting(String name) {
return "Hello " + name + "!";
}
}
ááááºážáá»á¯ááºáá°-
@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!
Quarkus ááẠáááºážááŸá®ážááŒá®ážáá¬áž frameworks áá»á¬ážá០á á¶ááŸááºáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááẠ- CDI ááŸáá·áº JAX-RS á ááááºá CDI ááŸáá·áº JAX-RS ááá¯á·ááŸáá·áº á¡áá¯ááºáá¯ááºáá°ážáá«á á¡áá áºá¡áááºážáá»á¬ážááᯠáá±á·áá¬áááºáááá¯á¡ááºáá«á
áá±áá¬áá±á·á áºááŸáá·áºá¡áá°á¡áá¯ááºáá¯ááº
á¡ááœá²á·á¡á
ááºážáá»á¬ážá¡ááœáẠHibernate ááŸáá·áº standard JPA ááŸááºáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá¬ážáááºá REST controllers áá²á·ááá¯á·á áááºááẠá¡áááºážáá¯á¶áž áá¯ááºáá±ážááẠááá¯á¡ááºáááºá á
á¯áá±ážááá¯ááºááŸá ááŸá®ááá¯ááŸá¯áá»á¬ážááᯠááœáŸááºááŒáááºá ááŸááºáá»ááºáá»á¬ážááá·áºááẠáá¯á¶áá±á¬ááºáááºá @Entity
ááŸáá·áº application.properties ááœáẠdatasource ááᯠconfigure áá¯ááºáá«á
á¡á¬ážáá¯á¶ážá sessionFactoryá persistence.xml ááá¯á·ááá¯áẠá¡ááŒá¬ážáááºáá±á¬ááºááŸá¯ááá¯ááºáá»á¬áž áááŸááá«á ááá¯á¡ááºáá±á¬áá¯ááºáá»á¬ážááá¯áᬠáá±ážáá«á ááá¯á·áá±á¬áº ááá¯á¡ááºáá«á áááºááẠpersistence.xml ááá¯ááºááᯠáááºáá®ážááá¯ááºááŒá®áž ORM á¡ááœáŸá¬ááᯠááá¯ááá¯á áááºáááºá áœá¬ áááºááŸááºááá¯ááºáááºá
Quarkus ááẠáá áºáá¯ááŸáá·áºáá áºáᯠáááºá ááºááŸá¯áá»á¬ážá¡ááœáẠá á¯áá±á¬ááºážááŸá¯áá»á¬ážá á á¯á ááºážááŸá¯áá»á¬ážááŸáá·áº á á¯á¶á ááºážáá±ážááŒááºážááŸá¯áá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáááºá ááááá áºáá»ááºá ááŒáá·áºááᬠá¡áááºážáá±á¬ááºážáá±ááá·áº ááŒááºááœááºáž Kubernetes node áá áºáá¯á¡ááœáẠááááºážáááºážááŒááºážá á¡á²áá«ááœá±á ááá°áá®áá±á¬ node áá»á¬ážá áááºááŸáºáá»á¬ážááᯠáá áºáá¯ááŸáá·áºáá áºáᯠáááºáá°ááŒá¯ááááá«á áá«á áá¬áá®ááŒá áºáááºááá¯á· áá»áŸá±á¬áºááá·áºáá«áááºá
Asynchronous áá¯ááºááᯠáá¯ááºáá±á¬ááºááŒááºážá
á¡áááºááœááºáá±á¬áºááŒáá²á·ááá·áºá¡ááá¯ááºáž Quarkus ááẠáá¬ááºááŒá¯ááŸá¯áááá¯ááááºážáááºážá ááá¯ááºááá¯áááºáž áá¶á·ááá¯ážáá±ážáááºá ááááºá¡ááá®áá±ážááŸááºážááá¯ááºááᯠááá°áá®áá±á¬áá¯á¶á á¶ááŒáá·áº áá±ážáá¬ážááá¯ááºáááºá
@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 áá¯ááºááá¯áááºáž áááºáá±á¬ááºááŸá¯ááá¯á· ááœáŸá²ááŒá±á¬ááºážááá¯ááºáááºá ááááºááẠáá°áá®áá«áááºá
á ááºážáááºááŒááºáž
Quarkus á¡ááá®áá±ážááŸááºážáá»á¬ážá¡ááœáẠá ááºážáááºááŸá¯áá»á¬ážááᯠJUnit4 ááá¯á·ááá¯áẠJUnit5 ááŒáá·áº áá±ážáá¬ážááá¯ááºáááºá á¡á±á¬ááºááœááºáá±á¬áºááŒáá¬ážáááºááŸá¬ á¡áá¯á¶ážááŸááºáá áºáá¯á¡ááœáẠááá°áá¬á ááºážáááºááŸá¯áá áºáá¯ááŒá áºááŒá®áž áááºážááᯠRestAssured ááá¯á¡áá¯á¶ážááŒá¯á áá±ážáá¬ážáá¬ážáá±á¬áºáááºáž á¡ááŒá¬ážáá°áá±á¬ááºááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
@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 ááŸááºáá»ááºááẠá ááºážáááºááŸá¯áá»á¬ážááá¯ááºáá±á¬ááºáá® á¡ááá®áá±ážááŸááºážááᯠrun ááẠááá·áºá¡á¬áž ááœáŸááºááŒá¬ážáá¬ážáááºá áá»ááºáá¬ááá±á¬á· developer á¡á¬ážáá¯á¶ážáá²á·áááºážááŸá®ážáá²á· code áá«á
ááááºáá±á¬ááºáž-áááá»áá±á¬áá»áŸá±á¬ááºááœáŸá¬
Quarkus ááẠGraalVM ááŸáá·áº áááºážáááºážáá»ááºáá»áẠáá±á«ááºážá
ááºáá¬ážáá±á¬ááŒá±á¬áá·áºá áááºážááẠááááºáá±á¬ááºážá¡ááá¯áẠáá¯ááºááᯠáá¯ááºáá¯ááºááẠáá±áá»á¬áá«áááºá áááºážááá¯áá¯ááºáá±á¬ááºáááºá áááºááẠGraalVM ááá¯ááá·áºááœááºážááŒá®áž GRAALVM_HOME áááºáááºážáá»ááºááŒá±á¬ááºážáá²ááŸá¯á¡á¬áž áááºááŸááºááẠááá¯á¡ááºáááºá áá±á¬ááºáááº
mvn package -Pnative
á áááºáááºá á¬ážá áá¬áá±á¬ááºážáá¬á áá¯ááºáá¯ááºááá¯ááºáá²á· Application ááᯠá ááºážáááºááá¯ááºáá«áááºá áá°ááá¯ááºááá¯ááºáá±á¬ááºááŸá¯ááẠJVM ááœááºáá¯ááºáá±á¬ááºááŒááºážááŸáá·áºááœá²ááŒá¬ážááá¯ááºáá±á¬ááŒá±á¬áá·áºáááºážáááºá¡áá±ážááŒá®ážáá«áááºá @SubstrateTest ááŸááºáá»ááºááẠááááºáá±á¬ááºážá¡ááá¯áẠá¡ááá®áá±ážááŸááºážáá¯ááºááᯠáá¯ááºáá±á¬ááºáááºá ááŸáááŒá®ážáá¬áž á ááºážáááºáá¯ááºááᯠááŒááºáá¯á¶ážááŒááºážááŒáá·áº á¡ááœá±áááºáá¶ááŸá¯ááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºáá±á¬ááºááá¯ááºáááºá ááá¯á·ááŒá±á¬áá·áºá ááááºáá±á¬ááºážáá±á«áºááœáẠáá°áááºááá·áº á¡ááá®áá±ážááŸááºážááᯠá ááºážáááºáááºá¡ááœáẠáá¯ááºááẠá€áá²á·ááá¯á· ááŒá áºáá±áááº-
@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {
}
áá¯ááºáá¯ááºááá¯ááºáá±á¬áá¯á¶á¡á¬áž Docker ááœáẠáá¯ááºááá¯ážááŒá®áž á¡áá±ážá
áááºáá±á¬áºááŒáá¬ážáá±á¬ Kubernetes ááá¯á·ááá¯áẠOpenShift ááœáẠáá¯ááºáá±á¬ááºááá¯ááºáááº
áááááá¬áá»á¬áž
Quarkus framework ááᯠMaven ááŸáá·áº Gradle ááá¯á·ááœáẠá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá Gradle ááŸáá·áºááá°áá² Maven ááᯠá¡ááŒáá·áºá¡ááá±á¬ááºáá¶áá«áááºá áá¶ááá±á¬ááºážá
áœá¬áá²á áá±á¬áá±á¬ááẠGradle ááẠá¡ááœááºááá±á¬áá»ááºáá
áºáᯠáááºáá®ážááŒááºážááᯠááá¶á·ááá¯ážááá¯ááºáá«á áááºááá¯ááºááœáẠá¡áá±ážá
áááºá¡áá»ááºá¡áááºáá»á¬áž ááŸááá«áááºá
áá»á²á·ááœááºááŸá¯
Quarkus ááẠááá¯ážáá»á²á·ááá¯ááºáá±á¬ áá°áá±á¬ááºáá
áºáá¯ááŒá
áºáááºá áá±á¬áá±á¬ááẠá¡á±á¬áºáá«áá
áºáá¯ááŸááááºá
áá±á¬ááºáá»ááº
áá»áœááºáá±á¬á·áºá¡ááŒááºá¡ááá±á¬á· Quarkus áᬠáá±ááºáá±á á®ážááŒá±á¬ááºážááœá±áá²á· á¡áá±á¬áºáá±ážááᯠááá¯ááºáá»á±á¬áá®ááœá±ááŒá áºáá±áá«áááºá Backend áá¯ááºááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááẠááá¯ááá¯ááœááºáá°áá¬ááŒá®ážá á€áá°áá±á¬ááºááẠDocker ááŸáá·áº Kubernetes á¡ááœáẠáá°áááºážáá¶á·ááá¯ážááŸá¯áá±á«ááºážááá·áºááŒááºážááŒáá·áº áááºáá±á¬ááºááŸá¯ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááᯠááá¯ááá¯ááá¯ážááŸááºážá á±ááŒá®áž ááŒááºáááºá á±áááºá ááŒá®ážáá¬ážáá±á¬á¡á¬ážáá¬áá»ááºááŸá¬ GraalVM á¡ááœáẠbuilt-in áá¶á·ááá¯ážááŸá¯ááŒá áºááŒá®áž áááºáá±á¬ááºááŸá¯áá»á¬ážááᯠá¡ááŸááºááááºáá»ááºááŒááºá áœá¬á áááºáááºááŸáá·áº ááŸááºáá¬ááºáá±áá¬á¡áááºážáááºáá¬áá°ááá¯ááºá á±ááá·áº ááááºáá±á¬ááºážá¡áá±á«áºá¡ááŒá±áá¶áá±á¬áá¯á¶áá»á¬ážáá¯ááºáá¯ááºááá·áºáá»áá¯ážáááºááŒá áºáááºá ááá¯ááºáááá¯áááºáá±á¬ááºááŸá¯áá»á¬ážááŸáá·áº áá¬áá¬áá²á·áááá¯áá¬áááºáá¬áá»á¬ážá¡ááœáẠá¡á á¯ááá¯ááºá¡ááŒá¯á¶ááá¯áẠáá«ááá¬áá«áá±á¬ áá»áœááºá¯ááºááá¯á·áá¡áá»áááºá áááºážááẠá¡ááœááºá¡áá±ážááŒá®ážáá«áááºá
ááá¬ážáááºááá¯áẠ-
source: www.habr.com