рдкрд░рд┐рдЪрдп
рдорд╛рд░реНрдЪ рен рдорд╛, RedHat (рдЪрд╛рдБрдбреИ IBM)
рд▓рдХреНрд╖реНрдп рднрдиреЗрдХреЛ Java рд▓рд╛рдИ Kubernetes рддреИрдирд╛рддреА рд░ рд╕рд░реНрднрд░рд▓реЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╕рди рд╡рд┐рдХрд╛рд╕рдХреЛ рд▓рд╛рдЧрд┐ рдЕрдЧреНрд░рдгреА рдкреНрд▓реЗрдЯрдлрд░реНрдо рдмрдирд╛рдЙрдиреБ рд╣реЛ, рдЬрд╕рд▓реЗ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓рд╛рдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реАрд╣рд░реВрдорд╛ рд╡рд┐рдХрд╛рд╕рдХреЛ рд▓рд╛рдЧрд┐ рдПрдХреАрдХреГрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред
рд╣реЗрд░реНрдиреБ рднрдпреЛ рднрдиреЗ
рдПрдкреНрд▓рд┐рдХреЗрд╕рди рд▓рдиреНрдЪрдХреЛ рдзреЗрд░реИ рдЙрдЪреНрдЪ рдЧрддрд┐ рд░ рдХрдо рдореЗрдореЛрд░реА рдЦрдкрдд рдкреНрд░рддрд┐рдЬреНрдЮрд╛ рдЧрд░рд┐рдПрдХреЛ рдЫред рдпрд╣рд╛рдБ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рдХреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯрдмрд╛рдЯ рдбрд╛рдЯрд╛ рдЫ:
рд╕реБрд░реБ рджреЗрдЦрд┐ рдкрд╣рд┐рд▓реЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ (рд╣рд░реВ):
рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди
REST
REST+JPA
рдХреНрд╡рд╛рд░реНрдХрд╕+рдЧреНрд░рд╛рд▓рд╡реАрдПрдо
0.014
0.055
рдХреНрд╡рд╛рд░реНрдХрд╕+рдУрдкрдирдЬреЗрдбреАрдХреЗ
0.75
2.5
рдкрд░рдореНрдкрд░рд╛рдЧрдд рдХреНрд▓рд╛рдЙрдб рдиреЗрдЯрд┐рдн рд╕реНрдЯреНрдпрд╛рдХ*
4.3
9.5
рдореЗрдореЛрд░реА рдЦрдкрдд (Mb):
рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди
REST
REST+JPA
рдХреНрд╡рд╛рд░реНрдХрд╕+рдЧреНрд░рд╛рд▓рд╡реАрдПрдо
13
35
рдХреНрд╡рд╛рд░реНрдХрд╕+рдУрдкрдирдЬреЗрдбреАрдХреЗ
74
130
рдкрд░рдореНрдкрд░рд╛рдЧрдд рдХреНрд▓рд╛рдЙрдб рдиреЗрдЯрд┐рдн рд╕реНрдЯреНрдпрд╛рдХ*
140
218
рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА, рд╣реИрди?
*рдореИрд▓реЗ рдпрд╕ рдЯреЗрдХреНрдиреЛрд▓реЛрдЬреА рд╕реНрдЯреНрдпрд╛рдХрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрдиреИ рдЬрд╛рдирдХрд╛рд░реА рдлреЗрд▓рд╛ рдкрд╛рд░реЗрди, рд╣рд╛рдореА рдорд╛рдиреНрди рд╕рдХреНрдЫреМрдВ рдХрд┐ рдпреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рд░реАрд░ рдХрд┐рдЯ рд╕рдВрдЧ рд╡рд╕рдиреНрдд рдмреБрдЯ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛред.
рдирдорд╕реНрдХрд╛рд░ рд╕рдВрд╕рд╛рд░!
рдХреНрд╡рд╛рд░реНрдХрд╕рдорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:
@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
рдирд┐рдпрдорд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧрдмрд╛рдЯ рднрд┐рдиреНрдирддрд╛ рдпреЛ рд╣реЛ рдХрд┐ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд░реНрдЧ рдЫреИрди! рдХреНрд╡рд╛рд░реНрдХрд╕рд▓реЗ рддрд╛рддреЛ рд░рд┐рд▓реЛрдбрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫ, рддреНрдпрд╕реИрд▓реЗ рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдкреБрди: рд╕реБрд░реБ рдирдЧрд░реА рдЖрдлреНрдиреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рд╡рд┐рдХрд╛рд╕рд▓рд╛рдИ рдЕрдЭ рдЫрд┐рдЯреЛ рдмрдирд╛рдЙрдБрджреИред
рдЕрдм рдХреЗ? рддрдкрд╛рдИрдВрд▓реЗ рдПрдиреЛрдЯреЗрд╕рди рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдирд┐рдпрдиреНрддреНрд░рдХрдорд╛ рд╕реЗрд╡рд╛ рдердкреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ
@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!
рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН рдХрд┐ рдХреНрд╡рд╛рд░реНрдХрд╕рд▓реЗ рдкрд░рд┐рдЪрд┐рдд рдлреНрд░реЗрдорд╡рд░реНрдХрд╣рд░реВ - CDI рд░ JAX-RS рдмрд╛рдЯ рдорд╛рдирдХ рдПрдиреЛрдЯреЗрд╕рдирд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред рдпрджрд┐ рддрдкрд╛рдИрдВрд▓реЗ CDI рд░ JAX-RS рд╕рдБрдЧ рдкрд╣рд┐рд▓реЗ рдХрд╛рдо рдЧрд░реНрдиреБрднрдПрдХреЛ рдЫ рднрдиреЗ, рдкрдХреНрдХреИ рдкрдирд┐ рдирдпрд╛рдБ рдХреБрд░рд╛ рд╕рд┐рдХреНрди рдЖрд╡рд╢реНрдпрдХ рдЫреИрдиред
рдбрд╛рдЯрд╛рдмреЗрд╕рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджреИ
рд╕рдВрд╕реНрдерд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рд░ рдорд╛рдирдХ JPA рдПрдиреЛрдЯреЗрд╕рдирд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред REST рдирд┐рдпрдиреНрддреНрд░рдХрд╣рд░реВ рдЬрд╕реНрддреИ, рддрдкрд╛рдИрдВрд▓реЗ рдиреНрдпреВрдирддрдо рдХреЛрдб рд▓реЗрдЦреНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдлрд╛рдЗрд▓рдорд╛ рдирд┐рд░реНрднрд░рддрд╛ рд╕рдВрдХреЗрдд рдЧрд░реНрди рдкрд░реНрдпрд╛рдкреНрдд рдЫ, рдПрдиреЛрдЯреЗрд╢рдирд╣рд░реВ рдердкреНрдиреБрд╣реЛрд╕реН @Entity
рд░ application.properties рдорд╛ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрдиреБрд╣реЛрд╕реНред
рд╕рдмреИред рдХреБрдиреИ sessionFactory, persistence.xml рд╡рд╛ рдЕрдиреНрдп рд╕реЗрд╡рд╛ рдлрд╛рдЗрд▓рд╣рд░реВ рдЫреИрдирдиреНред рд╣рд╛рдореА рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рдорд╛рддреНрд░ рд▓реЗрдЦреНрдЫреМрдВред рдпрджреНрдпрдкрд┐, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рднрдПрдорд╛, рддрдкрд╛рдЗрдБ persistence.xml рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ ORM рддрд╣рд▓рд╛рдИ рдЕрдЭ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
рдХреНрд╡рд╛рд░реНрдХрд╕рд▓реЗ рд╕рдВрд╕реНрдерд╛рд╣рд░реВрдХреЛ рдХреНрдпрд╛рд╕рд┐рдЩ, рдПрдХ-рджреЗрдЦрд┐-рдзреЗрд░реИ рд╕рдореНрдмрдиреНрдзрд╣рд░реВрдХреЛ рд╕рдЩреНрдХрд▓рди, рд░ рдкреНрд░рд╢реНрдирд╣рд░реВ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫред рдкрд╣рд┐рд▓реЛ рдирдЬрд░ рдорд╛ рдпреЛ рд░рд╛рдореНрд░реЛ рджреЗрдЦрд┐рдиреНрдЫ, рддрд░ рдпреЛ рдЫ рд╕реНрдерд╛рдирд┐рдп рдХреНрдпрд╛рд╕рд┐рдЩ, рдПрдХ Kubernetes рдиреЛрдбрдХреЛ рд▓рд╛рдЧрд┐ред рддреАред рд╡рд┐рднрд┐рдиреНрди рдиреЛрдбрд╣рд░реВрдХреЛ рдХреНрдпрд╛рд╕рд╣рд░реВ рдПрдХрдЕрд░реНрдХрд╛рд╕рдБрдЧ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬ рд╣реБрдБрджреИрдирдиреНред рдорд▓рд╛рдИ рдЖрд╢рд╛ рдЫ рдХрд┐ рдпреЛ рдЕрд╕реНрдерд╛рдпреА рд╣реЛред
рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдХреЛрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдорд╛рдерд┐ рдЙрд▓реНрд▓реЗрдЦ рдЧрд░рд┐рдП рдЕрдиреБрд╕рд╛рд░, рдХреНрд╡рд╛рд░реНрдХрд╕рд▓реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рд╢реИрд▓реАрд▓рд╛рдИ рдкрдирд┐ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫред рдЕрдШрд┐рд▓реНрд▓реЛ рдЖрд╡реЗрджрдирдХреЛ рдХреЛрдб рдлрд░рдХ рдлрд╛рд░рдордорд╛ рд▓реЗрдЦреНрди рд╕рдХрд┐рдиреНрдЫред
@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 + "!";
});
}
}
рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рдХреЛрдб рдкрдирд┐ рд╕реЗрд╡рд╛рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдкрд░рд┐рдгрд╛рдо рд╕рдорд╛рди рд╣реБрдиреЗрдЫред
рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрджреИ
рдХреНрд╡рд╛рд░реНрдХрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ 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 рдПрдиреЛрдЯреЗрд╕рдирд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдЪрд▓рд╛рдЙрдиреБ рдЕрдШрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЪрд▓рд╛рдЙрди рдирд┐рд░реНрджреЗрд╢рди рджрд┐рдиреНрдЫред рдмрд╛рдБрдХреА рд╕рдмреИ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрд▓рд╛рдИ рдкрд░рд┐рдЪрд┐рдд рдХреЛрдб рд╣реЛред
рдкреНрд▓реЗрдЯрдлрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧ
рдХреНрд╡рд╛рд░реНрдХрд╕ GraalVM рд╕рдБрдЧ рдЬреЛрдбрд┐рдПрдХреЛ рд╣реБрдирд╛рд▓реЗ, рдпреЛ рдкрдХреНрдХреИ рдкрдирд┐ рдкреНрд▓реЗрдЯрдлрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рд╕рдореНрднрд╡ рдЫред рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдИрдВрд▓реЗ GraalVM рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рд░ GRAALVM_HOME рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдердк
mvn package -Pnative
рдЪрд╛рдЦрд▓рд╛рдЧреНрджреЛ рдХреБрд░рд╛, рдЙрддреНрдкрдиреНрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рд░ рдпреЛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫ рдХрд┐рдирднрдиреЗ рдиреЗрдЯрд┐рдн рдХреЛрдбрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди JVM рдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднрдиреНрджрд╛ рдлрд░рдХ рд╣реБрди рд╕рдХреНрдЫред @SubstrateTest рдПрдиреЛрдЯреЗрд╕рдирд▓реЗ рдкреНрд▓реЗрдЯрдлрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛрдб рдЪрд▓рд╛рдЙрдБрдЫред рдЕрд╡рд╕реНрдерд┐рдд рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдкреБрди: рдкреНрд░рдпреЛрдЧ рд╡рд┐рд░рд╛рд╕рдд рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ; рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдкреНрд▓реЗрдЯрдлрд░реНрдо-рдирд┐рд░реНрднрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░реАрдХреНрд╖рдгрдХреЛ рд▓рд╛рдЧрд┐ рдХреЛрдб рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:
@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {
}
рдЙрддреНрдкрдиреНрди рдЫрд╡рд┐ рдбрдХрд░рдорд╛ рдкреНрдпрд╛рдХреЗрдЬ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рд░ Kubernetes рд╡рд╛ OpenShift рдорд╛ рдЪрд▓рд╛рдЙрди рд╕рдХрд┐рдиреНрдЫ, рдорд╛ рд╡рд┐рд╕реНрддреГрдд рд░реВрдкрдорд╛ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдЫред
рдЯреВрд▓рдХрд┐рдЯ
рдХреНрд╡рд╛рд░реНрдХрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ Maven рд░ Gradle рд╕рдБрдЧ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред Maven рдкреВрд░реНрдг рд░реВрдкрдорд╛ рд╕рдорд░реНрдерд┐рдд рдЫ, Gradle рдХреЛ рд╡рд┐рдкрд░реАрддред рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдпрд╕ рдХреНрд╖рдгрдорд╛ Gradle рд▓реЗ рдЦрд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рд╕рдорд░реНрдерди рдЧрд░реНрджреИрди; рд╡реЗрдмрд╕рд╛рдЗрдЯрдорд╛ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдЫред
рдПрдХреНрд╕реНрдЯреЗрдиреНрд╕рдирд╣рд░реВ
рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдХреНрд╕реНрдЯреЗрдиреНрд╕рд┐рдмрд▓ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реЛред рд╣рд╛рд▓ рддреНрдпрд╣рд╛рдБ рдПрдХ рдЖрджреЗрд╢ рдЫ
рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛
рдореЗрд░реЛ рд╡рд┐рдЪрд╛рд░рдорд╛, рдХреНрд╡рд╛рд░реНрдХрд╕ рд╕рдордпрдХреЛ рдкреНрд░рд╡реГрддреНрддрд┐рд╕рдБрдЧ рдПрдХрджрдо рдорд┐рд▓реНрджреЛрдЬреБрд▓реНрджреЛ рдЫред рдмреНрдпрд╛рдХрдПрдиреНрдб рдХреЛрдб рд╡рд┐рдХрд╛рд╕ рд╕рдЬрд┐рд▓реЛ рд░ рд╕рдЬрд┐рд▓реЛ рд╣реБрдБрджреИ рдЧрдЗрд░рд╣реЗрдХреЛ рдЫ, рд░ рдпреЛ рдврд╛рдБрдЪрд╛рд▓реЗ рдбрдХрд░ рд░ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рдиреЗрдЯрд┐рдн рд╕рдорд░реНрдерди рдердкреЗрд░ рд╕реЗрд╡рд╛ рд╡рд┐рдХрд╛рд╕рд▓рд╛рдИ рдердк рд╕рд░рд▓ рд░ рдЧрддрд┐ рджрд┐рдиреНрдЫред рдПрдЙрдЯрд╛ рдареВрд▓реЛ рдкреНрд▓рд╕ GraalVM рд░ рдкреНрд▓реЗрдЯрдлрд░реНрдо-рдирд┐рд░реНрднрд░ рдЫрд╡рд┐рд╣рд░реВрдХреЛ рдЙрддреНрдкрд╛рджрдирдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рд░реНрдорд┐рдд рд╕рдорд░реНрдерди рд╣реЛ, рдЬрд╕рд▓реЗ рд╕реЗрд╡рд╛рд╣рд░реВрд▓рд╛рдИ рд╕рд╛рдБрдЪреНрдЪреИ рдЫрд┐рдЯреЛ рд╕реБрд░реБ рдЧрд░реНрди рд░ рдереЛрд░реИ рдореЗрдореЛрд░реА рдард╛рдЙрдБ рд▓рд┐рди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рд░ рдпреЛ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрд╕ рд░ рд╕рд░реНрднрд░рд▓реЗрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдХреЛ рд▓рд╛рдЧрд┐ рдЬрди рдЬреЛрд╢рдХреЛ рд╣рд╛рдореНрд░реЛ рд╕рдордпрдорд╛ рдзреЗрд░реИ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫред
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд╛рдЗрдЯ -
рд╕реНрд░реЛрдд: www.habr.com