
рдкрд░рд┐рдЪрдп
7 рдорд╛рд░реНрдЪ рдХреЛ, RedHat (рдЬрд▓реНрдж рд╣реА IBM) рдиреЗ рдирдпрд╛ рдврд╛рдВрдЪрд╛, рдХреНрд╡рд╛рд░реНрдХрд╕ рдкреЗрд╢ рдХрд┐рдпрд╛ ред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдврд╛рдВрдЪрд╛ GraalVM рдФрд░ OpenJDK HotSpot рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдЗрд╕реЗ Kubernetes рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреНрд╡рд╛рд░реНрдХрд╕ рд╕реНрдЯреИрдХ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: JPA / рд╣рд╛рдЗрдмрд░рдиреЗрдЯ, JAX-RS / RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus рдФрд░ рдЕрдиреНрдпред
рд▓рдХреНрд╖реНрдп рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдФрд░ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛ рдХреЛ рдЕрдЧреНрд░рдгреА рдордВрдЪ рдмрдирд╛рдирд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдФрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рджреЛрдиреЛрдВ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХреАрдХреГрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдпрджрд┐ рдЖрдк рдЪреМрдЦрдЯреЗ рдХреЗ рдЗрд╕ рд╡рд░реНрдЧреАрдХрд░рдг рдХреЛ рджреЗрдЦреЗрдВ, рддреЛ рдХреНрд╡рд╛рд░реНрдХрд╕ "рдПрдЧреНрд░реАрдЧреЗрдЯрд░реНрд╕ / рдХреЛрдб рдЬреЗрдирд░реЗрдЯрд░реНрд╕" рдФрд░ "рд╣рд╛рдИ-рд▓реЗрд╡рд▓ рдлреБрд▓рд╕реНрдЯреИрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ" рдХреЗ рдмреАрдЪ рдХрд╣реАрдВ рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдкреВрд░реНрдг-рд╕реНрдЯреИрдХ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмреИрдХрдПрдВрдб рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЬрдореАрдиред
рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдЪреНрдЪ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдЧрддрд┐ рдФрд░ рдХрдо рдореЗрдореЛрд░реА рдЦрдкрдд рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдбреЗрд╡рд▓рдкрд░ рдХреА рд╕рд╛рдЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рд╣реИ:
рдкреНрд░рдердо рдЙрддреНрддрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рддрдХ рдХрд╛ рд╕рдордп:
рд╡рд┐рдиреНрдпрд╛рд╕ | рдмрд╛рдХреА | REST + JPA |
---|
рдХреНрд╡рд╛рд░реНрдХрд╕ + рдЧреНрд░реЗрд╡рд▓рд╡реАрдПрдо | 0.014 | 0.055 |
рдХреНрд╡рд╛рд░реНрдХрд╕ + рдУрдкрдирдЬреЗрдбрдХреЗ | 0.75 | 2.5 |
рдкрд╛рд░рдВрдкрд░рд┐рдХ рдХреНрд▓рд╛рдЙрдб рдиреЗрдЯрд┐рд╡ рд╕реНрдЯреИрдХ * | 4.3 | 9.5 |
рдореЗрдореЛрд░реА рдЦрдкрдд (рдПрдордмреА):
рд╡рд┐рдиреНрдпрд╛рд╕ | рдмрд╛рдХреА | REST + JPA |
---|
рдХреНрд╡рд╛рд░реНрдХрд╕ + рдЧреНрд░реЗрд╡рд▓рд╡реАрдПрдо | 13 | 35 |
рдХреНрд╡рд╛рд░реНрдХрд╕ + рдУрдкрдирдЬреЗрдбрдХреЗ | 74 | 130 |
рдкрд╛рд░рдВрдкрд░рд┐рдХ рдХреНрд▓рд╛рдЙрдб рдиреЗрдЯрд┐рд╡ рд╕реНрдЯреИрдХ * | 140 | 218 |
рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА, рд╣реИ рдирд╛?
* рдореБрдЭреЗ рдЗрд╕ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рд╕реНрдЯреИрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдорд┐рд▓реА, рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмреЙрдбреА рдХрд┐рдЯ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рд╣реИ ред
рдирдорд╕реНрддреЗ рд╡рд┐рд╢реНрд╡!
рдХреНрд╡рд╛рд░реНрдХрд╕ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
@Path("/hello") public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "hello"; } }
рдпрд╣ рд╡рд╕реНрддреБрддрдГ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдФрд░ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ! рдЖрдк рд╡рд┐рдХрд╛рд╕ рдореЛрдб рдореЗрдВ рдорд╛рд╡реЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
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 рд╕реЗ рдорд╛рдирдХ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рд╕реАрдбреАрдЖрдИ рдФрд░ рдЬреЗрдПрдХреНрд╕-рдЖрд░рдПрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рднреА рдирдпрд╛ рд╕реАрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред
рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╣рд╛рдЗрдмрд░рдиреЗрдЯ рдФрд░ рдорд╛рдирдХ рдЬреЗрдкреАрдП рдПрдиреЛрдЯреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред REST рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ рдиреНрдпреВрдирддрдо рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЕрд╕реЗрдВрдмрд▓реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, @Entity
рдПрдиреЛрдЯреЗрд╢рди рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдиреЗ рдФрд░ application.projectties рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @Entity
ред
рд╡рд╣ рд╕рдм рд╣реИред рдХреЛрдИ sessionFactory, рд╣рдаред xml рдФрд░ рдЕрдиреНрдп рд╕реЗрд╡рд╛ рдлрд╛рдЗрд▓реЗрдВред рд╣рдо рдХреЗрд╡рд▓ рдЙрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЖрдк рдПрдХ persistence.xml рдлрд╝рд╛рдЗрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ ORM рдкрд░рдд рдХреЛ рдЕрдзрд┐рдХ рд╕реВрдХреНрд╖реНрдорддрд╛ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреНрд╡рд╛рд░реНрдХрд╕ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдХреИрд╢рд┐рдВрдЧ, рдПрдХ рд╕реЗ рдХрдИ рд░рд┐рд╢реНрддреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣, рд╕рд╛рде рд╣реА рд╕рд╛рде рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд╣реЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рдХреИрд╢рд┐рдВрдЧ рд╣реИред рдпрд╛рдиреА рд╡рд┐рднрд┐рдиреНрди рдиреЛрдбреНрд╕ рдХреЗ рдХреИрд╢ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕реНрдерд╛рдпреА рд╣реИред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реИрд▓реА рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рдЖрд╡реЗрджрди рдХрд╛ рдХреЛрдб рджреВрд╕рд░реЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
@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_HOME рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдЕрдЧрд▓рд╛, рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╕рдордп рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:
mvn package -Pnative
рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдЙрддреНрдкрдиреНрди рдЖрд╡реЗрджрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ "рджреЗрд╢реА" рдХреЛрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди JVM рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдиреЛрдЯреЗрд╢рди @SubstrateTest рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдЪрд▓рд╛рддрд╛ рд╣реИред рдореМрдЬреВрджрд╛ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
@SubstrateTest public class GreetingResourceIT extends GreetingResourceTest { }
рдЙрддреНрдкрдиреНрди рдЫрд╡рд┐ рдХреЛ рдбреЙрдХрд░ рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдпрд╛ рдУрдкрдирд╢рд┐рдлреНрдЯ рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрдкрдХрд░рдг
рдХреНрд╡рд╛рд░реНрдХрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рд╡реЗрди рдФрд░ рдЧреНрд░реИрдбрд▓ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдорд╛рд╡реЗрд▓ рдЧреНрд░реИрдб рдХреЗ рд╡рд┐рдкрд░реАрдд рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рд╕рдордп рдЧреНрд░реЗрдбрд▓ рдПрдХ рдЦрд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдкреАрдврд╝реА рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рдЗрдЯ рдореЗрдВ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реИ ред
рд╡рд┐рд╕реНрддрд╛рд░
рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдХ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рд▓рдЧрднрдЧ 40 рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ - рд╕реНрдкреНрд░рд┐рдВрдЧ рдбрд┐ рдХрдВрдЯреЗрдирд░ рдФрд░ рдЕрдкрд╛рдЪреЗ рдКрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╕реЗ рд▓реЗрдХрд░ рд▓реЙрдЧрд┐рдВрдЧ рдФрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореАрдЯреНрд░рд┐рдХ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ред рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рд╡рд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрдЯрд▓рд┐рди рднрд╛рд╖рд╛ рдореЗрдВ рд▓реЗрдЦрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХреНрд╡рд╛рд░реНрдХрд╕ рд╕рдордп рдХреА рдкреНрд░рд╡реГрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдмреИрдХрдПрдВрдб рдХреЛрдб рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдЖрд╕рд╛рди рдФрд░ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдпрд╣ рдврд╛рдВрдЪрд╛ рдЖрдЧреЗ рдФрд░ рд╕рд░рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдЧрддрд┐ рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣рд╛ рд╣реИ, рдбреЙрдХрд░ рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП "рдореВрд▓" рд╕рдорд░реНрдерди рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдкреНрд▓рд╕ рдЧреНрд░реЗрд╡рд╛рд▓рдо рдФрд░ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЫрд╡рд┐рдпреЛрдВ рдХреА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд░реНрдерди рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдереЛрдбрд╝реА рдореЗрдореЛрд░реА рд╕реНрдкреЗрд╕ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рд╣рдорд╛рд░реЗ рд╕рдордп рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдФрд░ рд╕рд░реНрд╡рд░ рд░рд╣рд┐рдд рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реЗ рдЙрддреНрд╕рд╛рд╣ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ quarkus.io рд╣реИ ред рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг GitHub рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИрдВред