рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдХ рд╕реБрдкрд░рд╕реЛрдирд┐рдХ рд╕рдмрдЯреЛрдорд┐рдХ рдЬрд╛рднрд╛ рд╣реЛред рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рд┐рдВрд╣рд╛рд╡рд▓реЛрдХрди

рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдХ рд╕реБрдкрд░рд╕реЛрдирд┐рдХ рд╕рдмрдЯреЛрдорд┐рдХ рдЬрд╛рднрд╛ рд╣реЛред рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рд┐рдВрд╣рд╛рд╡рд▓реЛрдХрди

рдкрд░рд┐рдЪрдп

рдорд╛рд░реНрдЪ рен рдорд╛, RedHat (рдЪрд╛рдБрдбреИ IBM) рдкреНрд░рд╕реНрддреБрдд рдирдпрд╛рдБ рд░реВрдкрд░реЗрдЦрд╛ - рдХреНрд╡рд╛рд░реНрдХрд╕ред рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрдХрд╛ рдЕрдиреБрд╕рд╛рд░, рдпреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ GraalVM рд░ OpenJDK HotSpot рдорд╛ рдЖрдзрд╛рд░рд┐рдд рдЫ рд░ Kubernetes рдХреЛ рд▓рд╛рдЧрд┐ рдбрд┐рдЬрд╛рдЗрди рдЧрд░рд┐рдПрдХреЛ рд╣реЛред рдХреНрд╡рд╛рд░реНрдХрд╕ рд╕реНрдЯреНрдпрд╛рдХрд▓реЗ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus рд░ рдЕрдиреНрдпред

рд▓рдХреНрд╖реНрдп рднрдиреЗрдХреЛ 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 рд▓реЗ рдЦрд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рд╕рдорд░реНрдерди рдЧрд░реНрджреИрди; рд╡реЗрдмрд╕рд╛рдЗрдЯрдорд╛ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдЫред рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ.

рдПрдХреНрд╕реНрдЯреЗрдиреНрд╕рдирд╣рд░реВ

рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдХреНрд╕реНрдЯреЗрдиреНрд╕рд┐рдмрд▓ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реЛред рд╣рд╛рд▓ рддреНрдпрд╣рд╛рдБ рдПрдХ рдЖрджреЗрд╢ рдЫ 40 рд╡рд┐рд╕реНрддрд╛рд░рд╣рд░реВ, рдЬрд╕рд▓реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реНрдпрддрд╛ рдердкреНрдЫ - рд╕рдорд░реНрдердирдмрд╛рдЯ рд╡рд╕рдиреНрдд DI рдХрдиреНрдЯреЗрдирд░ ╨╕ рдЕрдкрд╛рдЪреЗ рдКрдБрдЯ рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рд╕реЗрд╡рд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд▓рдЧрд┐рдЩ рд░ рдкреНрд░рдХрд╛рд╢рди рдЧрд░реНрдиреБ рдЕрдШрд┐ред рд░ рддреНрдпрд╣рд╛рдБ рдкрд╣рд┐рд▓реЗ рдиреИ рдЬрд╛рднрд╛ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд, Kotlin рдорд╛ рд▓реЗрдЦрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдорд░реНрдерди рдЧрд░реНрди рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдЫред

рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛

рдореЗрд░реЛ рд╡рд┐рдЪрд╛рд░рдорд╛, рдХреНрд╡рд╛рд░реНрдХрд╕ рд╕рдордпрдХреЛ рдкреНрд░рд╡реГрддреНрддрд┐рд╕рдБрдЧ рдПрдХрджрдо рдорд┐рд▓реНрджреЛрдЬреБрд▓реНрджреЛ рдЫред рдмреНрдпрд╛рдХрдПрдиреНрдб рдХреЛрдб рд╡рд┐рдХрд╛рд╕ рд╕рдЬрд┐рд▓реЛ рд░ рд╕рдЬрд┐рд▓реЛ рд╣реБрдБрджреИ рдЧрдЗрд░рд╣реЗрдХреЛ рдЫ, рд░ рдпреЛ рдврд╛рдБрдЪрд╛рд▓реЗ рдбрдХрд░ рд░ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рдиреЗрдЯрд┐рдн рд╕рдорд░реНрдерди рдердкреЗрд░ рд╕реЗрд╡рд╛ рд╡рд┐рдХрд╛рд╕рд▓рд╛рдИ рдердк рд╕рд░рд▓ рд░ рдЧрддрд┐ рджрд┐рдиреНрдЫред рдПрдЙрдЯрд╛ рдареВрд▓реЛ рдкреНрд▓рд╕ GraalVM рд░ рдкреНрд▓реЗрдЯрдлрд░реНрдо-рдирд┐рд░реНрднрд░ рдЫрд╡рд┐рд╣рд░реВрдХреЛ рдЙрддреНрдкрд╛рджрдирдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рд░реНрдорд┐рдд рд╕рдорд░реНрдерди рд╣реЛ, рдЬрд╕рд▓реЗ рд╕реЗрд╡рд╛рд╣рд░реВрд▓рд╛рдИ рд╕рд╛рдБрдЪреНрдЪреИ рдЫрд┐рдЯреЛ рд╕реБрд░реБ рдЧрд░реНрди рд░ рдереЛрд░реИ рдореЗрдореЛрд░реА рдард╛рдЙрдБ рд▓рд┐рди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рд░ рдпреЛ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрд╕ рд░ рд╕рд░реНрднрд░рд▓реЗрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░рдХреЛ рд▓рд╛рдЧрд┐ рдЬрди рдЬреЛрд╢рдХреЛ рд╣рд╛рдореНрд░реЛ рд╕рдордпрдорд╛ рдзреЗрд░реИ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫред

рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд╛рдЗрдЯ - quarkus.ioред рджреНрд░реБрдд рд╕реБрд░реБрд╡рд╛рддрдХрд╛ рд▓рд╛рдЧрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдкрд╣рд┐рд▓реЗ рдиреИ рдЙрдкрд▓рдмреНрдз рдЫрдиреН GitHub.

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди