ืืงืืื
ืืืืฃ XNUMX ืืขืจ, RedHat (ืืึทืื IBM)
ืืขืจ ืฆืื ืืื ืฆื ืืึทืื Java ืื ืืืืื ื ืคึผืืึทืืคืึธืจืืข ืคึฟืึทืจ ืงืืืขืจื ืขืืขืก ืืืคึผืืืืืึทื ื ืืื ืกืขืจืืืขืจืืขืกืก ืึทืคึผืืึทืงืืืฉืึทื ืึทื ืืืืืงืืื ื, ืคึผืจืึทืืืืืืื ื ืืขืืืขืืึธืคึผืขืจืก ืืื ืึท ืืื ืึทืคืืื ืฆืืืึทื ื ืฆื ืึทื ืืืืืงืืื ื ืืื ืืืืืข ืจืืึทืงืืืื ืืื ืืืคึผืขืจืึทืืืื ืกืืืืื.
ืงืืงื ืืืืฃ
ืืืืขืจ ืืืื ืืืืงืืึทื ืคืื ืึทืคึผืืึทืงืืืฉืึทื ืงืึทืืขืจ ืืื ื ืืืขืจืืง ืืึผืจืื ืงืึทื ืกืึทืืฉืึทื ืืขื ืขื ืฆืืืขืืืื. ืืึธ ืืขื ืขื ืื ืืึทืื ืคืื ืื ืืขืืืขืืึธืคึผืขืจ ืก ืืืขืืืืืื:
ืฆืืื ืคืื ืึธื ืืืื ืฆื ืขืจืฉืืขืจ ืขื ืืคืขืจ (s):
ืงืึธื ืคืืืืจืึทืืืึธื
ืจื
REST+JPA
Quarkus+GraalVM
0.014
0.055
Quarkus + OpenJDK
0.75
2.5
ืืจืึทืืืฆืืึธื ืขื ืงืืึธืื ืืขืืืืจื ืกืืึทืง *
4.3
9.5
ืืึผืจืื ืงืึทื ืกืึทืืฉืึทื (Mb):
ืงืึธื ืคืืืืจืึทืืืึธื
ืจื
REST+JPA
Quarkus+GraalVM
13
35
Quarkus + OpenJDK
74
130
ืืจืึทืืืฆืืึธื ืขื ืงืืึธืื ืืขืืืืจื ืกืืึทืง *
140
218
ืืืคึผืจืขืกืืื, ืืื ื ืื ืขืก?
*ืืื ืืึธื ื ืื ืืขืคึฟืื ืขื ืงืืื ืืื ืคึฟืึธืจืืึทืฆืืข ืืืขืื ืืขื ืืขืื ืึธืืึธืืืข ืึธื ืืืืื, ืืืจ ืงืขื ืขื ืืืขืจื ืขืืขื ืึทื ืืึธืก ืืื ืึท ืืื ืคืื ืกืคึผืจืื ื ืฉืืืืื ืืื ืึทื ื ืึธื ืืืฃ ืงืื.
ืืขืื ืืืขืื!
ืื ืกืืืคึผืืึทืกื ืึทืคึผืืึทืงืืืฉืึทื ืืขืฉืจืืื ืืื Quarkus ืืืึธืื ืงืืงื ืืื ืืึธืก:
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
}
ืขืก ืืื ืืืฉ ืืืื ืงืืึทืก ืืื ืืึธืก ืืื ืืขื ืื! ืืืจ ืงืขื ืขื ืืืืคื ืื ืึทืคึผืืึทืงืืืฉืึทื ื ืืฆื Maven ืืื ืึทื ืืืืืงืืื ื ืืึธืืข:
mvn compile quarkus:dev
โฆ
$ curl http://localhost:8080/hello
hello
ืืขืจ ืืืืืง ืคืื ืึท ืจืขืืืืขืจ ืึทืคึผืืึทืงืืืฉืึทื ืืื ืึทื ืขืก ืืื ืงืืื ืึทืคึผืคึผืืืงืึทืืืึธื ืงืืึทืก! Quarkus ืฉืืืฆื ืืืืก ืจืืืึธืื, ืึทืืื ืืืจ ืงืขื ืขื ืืืืฉื ืืืื ืึทืคึผืืึทืงืืืฉืึทื ืึธื ืจืืกืืึทืจืืื ื ืขืก, ืืืึธืก ืืืื ืึทื ืืืืืงืืื ื ืืคืืื ืคืึทืกืืขืจ.
ืืืืก ืืื ื ืขืงืกื? ืืืจ ืงืขื ืขื ืืืืื ืึท ืกืขืจืืืืก ืฆื ืึท ืงืึธื ืืจืึธืืืขืจ ืืื ืึทื ืึทื ืึธืืึทืฆืืข
@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 ื ืืฆื ื ืึธืจืืึทื ืึทื ืึทืืืืฉืึทื ื ืคืื ืืึทืงืึทื ื ืคืจืึทืืขืืืึธืจืงืก - CDI ืืื JAX-RS. ืขืก ืืื ื ืื ืืึทืจืคึฟื ืฆื ืืขืจื ืขื ืขืคึผืขืก ื ืืึท ืืืื ืืืจ ืืึธื ืืขืืจืืขื ืืื CDI ืืื JAX-RS ืคืจืืขืจ, ืืึธื.
ืึทืจืืขื ืืื ืื ืืึทืืึทืืืืก
ืืืืืขืจื ืืื ืืื ื ืึธืจืืึทื ืืืฉืคึผืึท ืึทื ืึทืืืืฉืึทื ื ืคึฟืึทืจ ืขื ืืืืื ืืขื ืขื ืืขื ืืฆื. ืืื ืืื REST ืงืึทื ืืจืึธืืืขืจื, ืืืจ ืืึทืจืคึฟื ืฆื ืฉืจืืึทืื ืึท ืืื ืืืื ืคืื ืงืึธื. ืขืก ืืื ืืขื ืื ืฆื ืึธื ืืืืึทืื ืื ืืืคึผืขื ืืึทื ืกืื ืืื ืื ืคึฟืึทืจืืึทืืืื ื ืืขืงืข, ืืืืื ืึทื ืึทืืืืฉืึทื ื @Entity
ืืื ืงืึทื ืคืืืืขืจ ืืึทืืึทืกืึธืืจืก ืืื ืึทืคึผืคึผืืืงืึทืืืึธื.ืคึผืจืึธืคึผืขืจืืืขืก.
ืึทืืข. ืงืืื sessionFactory, persistence.xml ืึธืืขืจ ืื ืืขืจืข ืกืขืจืืืืก ืืขืงืขืก. ืืืจ ืฉืจืืึทืื ืืืืื ืื ืงืึธื ืืืึธืก ืืื ืืืจืฃ. ืึธืืขืจ, ืืืื ื ืืืืืง, ืืืจ ืงืขื ืขื ืืึทืื ืึท persistence.xml ืืขืงืข ืืื ืงืึทื ืคืืืืขืจ ืื ORM ืฉืืืืข ืืขืจ ืคืืื ืื.
ืงืืืึทืจืงืืก ืฉืืืฆื ืงืึทืืฉืื ื ืคืื ืขื ืืืืื, ืืึทืืืื ืืขื ืคึฟืึทืจ ืืืื-ืฆื-ืคืืืข ืืืฆืืื ืืขื ืืื ืคึฟืจืืื. ืืื ืขืจืฉืืขืจ ืืืืง ืขืก ืงืืงื ืืจืืืก, ืึธืืขืจ ืขืก ืืื ืืืืข ืงืึทืืฉืื ื, ืคึฟืึทืจ ืืืื Kubernetes ื ืึธืืข. ืืขื ืข. ืื ืงืึทืืฉืขืก ืคืื ืคืึทืจืฉืืืขื ืข ื ืึธืืื ืืขื ืขื ื ืืฉื ืกืื ืืงืจืึทื ืืืื ืืื ืืขืืขืจ ืื ืืขืจืขืจ. ืืื ืืืฃ ืื ืืืก ืืื ืฆืืืืืืืืืื.
ืืืกืื ืืงืจืึทื ืึทืก ืงืึธื ืืืจืืคืืจืื ื
ืืื ืืขืจืืื ื ืืืืื, 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 + "!";
});
}
}
ืึทืกืื ืืฉืจืึธื ืึธืืก ืงืึธื ืงืขื ืขื ืืืื ืืืื ืืจืึทื ืกืคืขืจื ืฆื ืื ืกืขืจืืืืก, ืืขืจ ืจืขืืืืืึทื ืืืขื ืืืื ืื ืืขืืืข.
ืืขืกืืื ื
ืืขืกืฅ ืคึฟืึทืจ 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 ืึทื ืึธืืึทืฆืืข ืื ืกืืจืึทืงืฅ ืืืจ ืฆื ืืืืคื ืื ืึทืคึผืืึทืงืืืฉืึทื ืืืืืขืจ ืืืจ ืืืืคื ืืขืกืฅ. ืื ืื ืืื ืืื ืงืึธื ืืึทืงืึทื ื ืฆื ืึทืืข ืืขืืืขืืึธืคึผืขืจืก.
ืคึผืืึทืืคืึธืจืืข-ืกืคึผืขืฆืืคืืฉ ืึทืคึผืืึทืงืืืฉืึทื
ืืื ื Quarkus ืืื ืืืืืื ืื ืึทืืจืืืืื ืืื GraalVM, ืขืก ืืื ืืึธื ืืขืืืขื ืฆื ืืืฉืขื ืขืจืืื ืคึผืืึทืืคืึธืจืืข-ืกืคึผืขืฆืืคืืฉ ืงืึธื. ืฆื ืืึธื ืืึธืก, ืืืจ ืืึทืจืคึฟื ืฆื ืื ืกืืึทืืืจื GraalVM ืืื ืกืคึผืขืฆืืคืืฆืืจื ืื GRAALVM_HOME ืกืืืืืืข ืืืึทืืขืืืืืง. ืืืืืืขืจ
mvn package -Pnative
ืื ืืขืจืขืกืืื ืืื, ืื ืืืฉืขื ืขืจืืืืึทื ืึทืคึผืืึทืงืืืฉืึทื ืงืขื ืขื ืืืื ืืขืกืืขื. ืืื ืืึธืก ืืื ืืืืืืืง ืืืืึทื ืื ืืืจืืคืืจืื ื ืคืื ืืขืืืืจื ืงืึธื ืงืขื ืืืื ืึทื ืืขืจืฉ ืคืื ืื ืืืจืืคืืจืื ื ืืืืฃ ืื JVM. ืื @SubstrateTest ืึทื ืึธืืึทืฆืืข ืืืืคื ืคึผืืึทืืคืึธืจืืข-ืกืคึผืขืฆืืคืืฉ ืึทืคึผืืึทืงืืืฉืึทื ืงืึธื. ืจืืืืื ื ืืืืืกืืื ื ืคึผืจืึธืืข ืงืึธื ืงืขื ืขื ืืืื ืืืจืืืขืงืึธืื ืืื ืืจืืฉื; ืืื ืึท ืจืขืืืืืึทื, ืืขืจ ืงืึธื ืคึฟืึทืจ ืืขืกืืื ื ืึท ืคึผืืึทืืคืึธืจืืข-ืึธืคืขื ืืืง ืึทืคึผืืึทืงืืืฉืึทื ืืืขื ืงืืงื ืืื ืืึธืก:
@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {
}
ืื ืืืฉืขื ืขืจืืืืึทื ืืืื ืงืขื ืขื ืืืื ืคึผืึทืงืืืืฉื ืืื ืืึธืงืงืขืจ ืืื ืืืืคื ืืื Kubernetes ืึธืืขืจ OpenShift, ืืืกืงืจืืืื ืืื ืืขืืึทื ืืื
ืืืฉืืจืื
ืื Quarkus ืคืจืืืืืืขืจืง ืงืขื ืขื ืืืื ืืขืืืืื ื ืืื Maven ืืื Gradle. Maven ืืื ืืึธืจ ืืขืฉืืืฆื, ื ืื ืขื ืืขื Gradle. ืฆืื ืืึทืืืืขืจื, ืืื ืืขืจ ืืึธืืขื ื, Gradle ืฉืืืฆื ื ืืฉื ืืืฉืขื ืขืจืืืืื ื ืึท ืืืืืืง ืคึผืจืืืขืงื; ืขืก ืืื ืืืืืืื ืืื ืคึฟืึธืจืืึทืฆืืข ืืืืฃ ืืขื ืืืขืืืืืื
ืขืงืกืืจืขืืขื ืฅ
ืงืืืึทืจืงืืก ืืื ืึทื ืขืงืกืืขื ืกืืืืข ืคืจืืืืืืขืจืง. ืืขืจืืืืึทื ืขืก ืืื ืึท ืกืืจ
ืกืึธืฃ
ืืื ืืืื ืืืื ืื ื, ืงืืืึทืจืงืืก ืืื ืืึทื ืฅ ืืื ืฉืืจื ืืื ืื ืืจืขื ืืก ืคืื ืื ืฆืืึทื. ืืึทืงืขื ื ืงืึธื ืึทื ืืืืืงืืื ื ืืื ืฉืืื ืืจืื ืืขืจ ืืื ืืจืื ืืขืจ, ืืื ืืขื ืคืจืืืืืืขืจืง ืืืืึทืืขืจ ืกืืืคึผืืึทืคืืื ืืื ืกืคึผืืื ืึทืจืืืฃ ืืื ืกื ืึทื ืืืืืงืืื ื ืืืจื ืึทืืื ื ืืขืืืืจื ืฉืืืฆื ืคึฟืึทืจ ืืึธืงืงืขืจ ืืื ืงืืืขืจื ืขืืขืก. ื ืจืืืืง ืคึผืืืก ืืื ืื ืืขืืืื-ืืื ืฉืืืฆื ืคึฟืึทืจ GraalVM ืืื ืื ืืืจ ืคืื ืคึผืืึทืืคืึธืจืืข-ืึธืคืขื ืืืง ืืืืืขืจ, ืืืึธืก ืึทืืึทืื ืืึทืืื ืื ืืก ืฆื ืึธื ืืืืื ืืึทืงืข ืืขืฉืืืื ื ืืื ื ืขืืขื ืึท ืืืกื ืืืงืึธืจื ืคึผืืึทืฅ. ืืื ืืึธืก ืืื ืืืืขืจ ืืืืืืืง ืืื ืืื ืืืขืจ ืฆืืื ืคืื ืืึทืกืข ืืืึทืื ืฉืึทืคื ืคึฟืึทืจ ืืืงืจืึธ ืืึทืืื ืื ืืก ืืื ืกืขืจืืืขืจืืขืกืก ืึทืจืงืึทืืขืงืืฉืขืจ.
ืืึทืึทืืืขืจ ืคึผืืึทืฅ -
ืืงืืจ: www.habr.com