рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдирд╣реАрдВ: рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛ рдЕрд╡рд▓реЛрдХрди



рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬрд╛рд╡рд╛ рдФрд░ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреА рдХреЛрдИ рдХрдореА рдирд╣реАрдВ рд╣реИред рд▓реЗрдЦ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ:
рдирд╛рдорд╕рдВрд╕реНрдХрд░рдгрдкрд╣рд▓реЗ рд░рд┐рд▓реАрдЬ рдХрд╛ рд╕рд╛рд▓рдбреЗрд╡рд▓рдкрд░
рд╣реЗрд▓рд┐рджреЛрди рд╕реЗ1.1.12019рдУрд░реЗрдХрд▓
Ktor1.2.12018рдЬреЗрдЯрдмреНрд░реЗрдиреНрд╕
Micronaut1.1.32018рдСрдмреНрдЬреЗрдХреНрдЯ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ
рд╡рд╕рдВрдд рдХрд╛ рдмреВрдЯ2.1.52014рдХреЗрдВрджреНрд░реАрдп

рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЪрд╛рд░ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде HTTP рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрд╡рд╛ рдбрд┐рд╕реНрдХрд╡рд░реА рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡реЗ рдПрдХ рд╡рд┐рд╖рдо (рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реНрддрд░ рдкрд░) рдорд╛рдЗрдХреНрд░реЛрд╕рд┐рд╕реНрдЯрд╡рд░реНрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдмрдирд╛рддреЗ рд╣реИрдВ (рдмрд╛рдж рдореЗрдВ рдЖрдИрдПрд╕рдП рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд):



рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ:

  • рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рд╕реНрдЯреИрдХ:
    • рдЬреЗрдбреАрдХреЗ 12;
    • Kotlin;
    • рдЧреНрд░реИрдбрд▓ (рдХреЛрдЯрд▓рд┐рди рдбреАрдПрд╕рдПрд▓);
    • JUnit 5ред

  • рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ (HTTP API):
    • GET /application-info{?request-to=some-service-name}
      Microservice (рдирд╛рдо, рдлреНрд░реЗрдорд╡рд░реНрдХ, рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд░рд┐рд▓реАрдЬ рдХрд╛ рд╡рд░реНрд╖) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА рд▓реМрдЯрд╛рддрд╛ рд╣реИ; рдЬрдм рдЕрдкрдиреЗ HTTP рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП request-to рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдЪрд╛рд░ рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕рдорд╛рди рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ;
    • GET /application-info/logo
      рдЫрд╡рд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

  • рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
    • рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯрдЕрдк;
    • рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
    • HTTP API рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдгред

  • рдИрд╕рд╛:
    • рд╕реЗрд╡рд╛ рдбрд┐рд╕реНрдХрд╡рд░реА рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХрд░рдг рдХрд░рдирд╛, рдХреНрд▓рд╛рдЗрдВрдЯ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕рдХреЗ рдирд╛рдо рд╕реЗ рдПрдХ рдФрд░ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛ рдХреЗ HTTP рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдВрдЪрдирд╛);
    • uber- рдЬрд╛рд░ рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп рдЧрдардиред


рдЕрдЧрд▓рд╛, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реИрд╕ рд╕рд░реНрд╡рд┐рд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВред

рд╣реЗрд▓рд┐рдбрди рд╕реЗрд╡рд╛


рдЖрдВрддрд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдУрд░реЗрдХрд▓ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдврд╛рдВрдЪрд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдмрд╛рдж рдореЗрдВ рдУрдкрди-рд╕реЛрд░реНрд╕ рдмрди рдЧрдпрд╛ред рдЗрд╕ рдврд╛рдВрдЪреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджреЛ рд╡рд┐рдХрд╛рд╕ рдореЙрдбрд▓ рд╣реИрдВ: рдорд╛рдирдХ рд╕рдВрд╕реНрдХрд░рдг (рдПрд╕рдИ) рдФрд░ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ (рдПрдордкреА)ред рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕реЗрд╡рд╛ рдПрдХ рдирд┐рдпрдорд┐рдд рдЬрд╛рд╡рд╛ рдПрд╕рдИ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреГрд╖реНрда рдХреЗ рдЕрдВрддрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдиреЗрдВред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣реЗрд▓рд┐рдбреЙрди рдПрдордкреА рдПрдХреНрд▓рд┐рдкреНрд╕ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬреЛ рдХрдИ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рдЬрд╛рд╡рд╛ рдИрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреЗрдПрдХреНрд╕-рдЖрд░рдПрд╕, рд╕реАрдбреАрдЖрдИ) рдФрд░ рдирдП рд▓реЛрдЧреЛрдВ (рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреА рдЬрд╛рдВрдЪ, рдореЗрдЯреНрд░рд┐рдХреНрд╕, рдлреЙрд▓реНрдЯ рдЯреЙрд▓рд░реЗрдВрд╕) рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЯреАред рдбреАред)ред рд╣реЗрд▓рд┐рдбрди рдПрд╕рдИ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ "рдиреЛ рдореИрдЬрд┐рдХ" рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХрдо рд╕реЗ рдХрдо рдпрд╛ рдХреЛрдИ рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

рд╣реЗрд▓рд┐рдбреЙрди рдПрд╕рдИ рдХреЛ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдореЗрдВ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдЗрди рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рд╣реИред рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд░реНрдЧ KoinComponent рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ ред рдХреЛрдЗрди рдкрд╣рд▓реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдлрд┐рд░ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╢реБрд░реВ рдХреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ startServer() рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╡реЗрдмрд╕рд░реНрд╡рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рд░реВрдЯрд┐рдВрдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд╣рд▓реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ; рдЖрд╡реЗрджрди рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╡рд┐рдкрдХреНрд╖ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реИ:

 object HelidonServiceApplication : KoinComponent { @JvmStatic fun main(args: Array<String>) { val startTime = System.currentTimeMillis() startKoin { modules(koinModule) } val applicationInfoService: ApplicationInfoService by inject() val consulClient: Consul by inject() val applicationInfoProperties: ApplicationInfoProperties by inject() val serviceName = applicationInfoProperties.name startServer(applicationInfoService, consulClient, serviceName, startTime) } } fun startServer( applicationInfoService: ApplicationInfoService, consulClient: Consul, serviceName: String, startTime: Long ): WebServer { val serverConfig = ServerConfiguration.create(Config.create().get("webserver")) val server: WebServer = WebServer .builder(createRouting(applicationInfoService)) .config(serverConfig) .build() server.start().thenAccept { ws -> val durationInMillis = System.currentTimeMillis() - startTime log.info("Startup completed in $durationInMillis ms. Service running at: http://localhost:" + ws.port()) // register in Consul consulClient.agentClient().register(createConsulRegistration(serviceName, ws.port())) } return server } 

рд░реВрдЯрд┐рдВрдЧ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 private fun createRouting(applicationInfoService: ApplicationInfoService) = Routing.builder() .register(JacksonSupport.create()) .get("/application-info", Handler { req, res -> val requestTo: String? = req.queryParams() .first("request-to") .orElse(null) res .status(Http.ResponseStatus.create(200)) .send(applicationInfoService.get(requestTo)) }) .get("/application-info/logo", Handler { req, res -> res.headers().contentType(MediaType.create("image", "png")) res .status(Http.ResponseStatus.create(200)) .send(applicationInfoService.getLogo()) }) .error(Exception::class.java) { req, res, ex -> log.error("Exception:", ex) res.status(Http.Status.INTERNAL_SERVER_ERROR_500).send() } .build() 

рдЖрд╡реЗрджрди HOCON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

 webserver { port: 8081 } application-info { name: "helidon-service" framework { name: "Helidon SE" release-year: 2019 } } 

JSON, YAML рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдкреНрд░рд╛рд░реВрдк ( рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг) рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред

рдХреЛрдЯрд░ рд╕реЗрд╡рд╛


рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рд░реВрдкрд░реЗрдЦрд╛ рд▓рд┐рдЦреА рдЧрдИ рд╣реИред рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрдИ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ: рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдгрд╛рд▓реА, start.ktor.io рдпрд╛ рдкреНрд▓рдЧ-рдЗрди IntelliJ IDEA ( рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред

рд╣реЗрд▓рд┐рджреЛрди рдПрд╕рдИ рдХреА рддрд░рд╣, Ktor рдореЗрдВ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ DI рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ Koin рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рддреА рд╣реИрдВ:

 val koinModule = module { single { ApplicationInfoService(get(), get()) } single { ApplicationInfoProperties() } single { ServiceClient(get()) } single { Consul.builder().withUrl("http://localhost:8500").build() } } fun main(args: Array<String>) { startKoin { modules(koinModule) } val server = embeddedServer(Netty, commandLineEnvironment(args)) server.start(wait = true) } 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрдВ (рдпрд╣ рдХреЗрд╡рд▓ HOCON рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, Ktor рд╕рд░реНрд╡рд░ рдХреЛ рдпрд╣рд╛рдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ), рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдиреАрдЪреЗ рдкреНрд░рд╕реНрддреБрдд рдХреА рдЧрдИ рд╣реИрдВ:

 ktor { deployment { host = localhost port = 8082 watch = [io.heterogeneousmicroservices.ktorservice] } application { modules = [io.heterogeneousmicroservices.ktorservice.module.KtorServiceApplicationModuleKt.module] } } application-info { name: "ktor-service" framework { name: "Ktor" release-year: 2018 } 

Ktor рдФрд░ Koin рд╢рдмреНрдж "рдореЙрдбреНрдпреВрд▓" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЕрд░реНрде рд╣реИрдВред рдХреЛрдЗрди рдореЗрдВ, рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрджрд░реНрдн рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред Ktor рдореЙрдбреНрдпреВрд▓ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд░реВрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдЕрдиреБрд░реЛрдз, рдЖрджрд┐:

 fun Application.module() { val applicationInfoService: ApplicationInfoService by inject() if (!isTest()) { val consulClient: Consul by inject() registerInConsul(applicationInfoService.get(null).name, consulClient) } install(DefaultHeaders) install(Compression) install(CallLogging) install(ContentNegotiation) { jackson {} } routing { route("application-info") { get { val requestTo: String? = call.parameters["request-to"] call.respond(applicationInfoService.get(requestTo)) } static { resource("/logo", "logo.png") } } } } 

рдЗрд╕ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ, рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рд░рд╛рдЙрдЯрд┐рдВрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕реНрдереИрддрд┐рдХ рд╕рдВрд╕рд╛рдзрди logo.png ред

Ktor рд╕реЗрд╡рд╛ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЕрдиреБрд░реЛрдз-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди ( рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЙрджрд╛рд╣рд░рдг , рд╕рдВрдкреАрдбрд╝рди, рдФрд░ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрдиреНрдп) рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рд╣реИред рдЕрдкрдиреА рдЦреБрдж рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рдХреЛрдб рдХреЛрдб рд░рд╛рдЙрдВрдб-рд░реЙрдмрд┐рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЧреНрд░рд╛рд╣рдХ рднрд╛рд░ рд╕рдВрддреБрд▓рди рдХреЗ рд╕рд╛рде рд╕реЗрд╡рд╛ рдбрд┐рд╕реНрдХрд╡рд░реА рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:

 class ConsulFeature(private val consulClient: Consul) { class Config { lateinit var consulClient: Consul } companion object Feature : HttpClientFeature<Config, ConsulFeature> { var serviceInstanceIndex: Int = 0 override val key = AttributeKey<ConsulFeature>("ConsulFeature") override fun prepare(block: Config.() -> Unit) = ConsulFeature(Config().apply(block).consulClient) override fun install(feature: ConsulFeature, scope: HttpClient) { scope.requestPipeline.intercept(HttpRequestPipeline.Render) { val serviceName = context.url.host val serviceInstances = feature.consulClient.healthClient().getHealthyServiceInstances(serviceName).response val selectedInstance = serviceInstances[serviceInstanceIndex] context.url.apply { host = selectedInstance.service.address port = selectedInstance.service.port } serviceInstanceIndex = (serviceInstanceIndex + 1) % serviceInstances.size } } } } 

рдореБрдЦреНрдп рддрд░реНрдХ install рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реИ: рд░реЗрдВрдбрд░ рдЕрдиреБрд░реЛрдз рдЪрд░рдг (рдЬреЛ рд╕реЗрдВрдб рдлреЗрдЬ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рддрд╛ рд╣реИ) рдХреЗ рджреМрд░рд╛рди, рдЬрд┐рд╕ рд╕реЗрд╡рд╛ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЙрд╕рдХрд╛ рдирд╛рдо рдкрд╣рд▓реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА consulClient рд╕реЗ consulClient , рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд░рд╛рдЙрдВрдб-рд░реЙрдмрд┐рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрджрд╛рд╣рд░рдг рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЙрд▓ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

 fun getApplicationInfo(serviceName: String): ApplicationInfo = runBlocking { httpClient.get<ApplicationInfo>("http://$serviceName/application-info") } 


рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рддреНрд░реА рд╕реЗрд╡рд╛


рдорд╛рдЗрдХреНрд░реЛрдиреНрдпреВрдЯ рдХреЛ рдЧреНрд░рд┐рд▓реНрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдФрд░ рдЧреНрд░реЗрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдирд┐рд░реНрдорд╛рдг рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдЕрдиреБрднрд╡ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИред рдЬрд╛рд╡рд╛, рдХреЛрдЯрд▓рд┐рди рдФрд░ рдЧреНрд░реВрд╡реА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдмрд╣реБрднреБрдЬ рдврд╛рдВрдЪрд╛ рд╣реИ; рд╢рд╛рдпрдж рд╕реНрдХрд╛рд▓рд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реЛрдЧрд╛ред рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдореЗрдореЛрд░реА рдЦрдкрдд рдФрд░ рддреЗрдЬреА рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЦреНрдп рд╡рд░реНрдЧ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рд╣реИрдВ:

 object MicronautServiceApplication { @JvmStatic fun main(args: Array<String>) { Micronaut.build() .packages("io.heterogeneousmicroservices.micronautservice") .mainClass(MicronautServiceApplication.javaClass) .start() } } 

рдорд╛рдЗрдХреНрд░реЛ-рдЖрдзрд╛рд░рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рдХреБрдЫ рдШрдЯрдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрдирдХреЗ рд╕рдордХрдХреНрд╖реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдпрдВрддреНрд░рдХ рдХреЛрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:

 @Controller( value = "/application-info", consumes = [MediaType.APPLICATION_JSON], produces = [MediaType.APPLICATION_JSON] ) class ApplicationInfoController( private val applicationInfoService: ApplicationInfoService ) { @Get fun get(requestTo: String?): ApplicationInfo = applicationInfoService.get(requestTo) @Get("/logo", produces = [MediaType.IMAGE_PNG]) fun getLogo(): ByteArray = applicationInfoService.getLogo() } 

Micronaut рдореЗрдВ рдХреЛрдЯрд▓рд┐рди рд╕рдкреЛрд░реНрдЯ kapt рд╕рдВрдХрд▓рдХ рдкреНрд▓рдЧрдЗрди (рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдБ ) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЕрд╕реЗрдВрдмрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ рд╣реИ:

 plugins { ... kotlin("kapt") ... } dependencies { kapt("io.micronaut:micronaut-inject-java") ... kaptTest("io.micronaut:micronaut-inject-java") ... } 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ:

 micronaut: application: name: micronaut-service server: port: 8083 consul: client: registration: enabled: true application-info: name: ${micronaut.application.name} framework: name: Micronaut release-year: 2018 

JSON, рдЧреБрдг, рдФрд░ Groovy рдлрд╝рд╛рдЗрд▓ рд╕реНрд╡рд░реВрдкреЛрдВ ( рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг) рдХреЗ рд╕рд╛рде рдорд╛рдЗрдХреНрд░реЛрд╕реЙрд░реНрдлрд╝ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рднреА рд╕рдВрднрд╡ рд╣реИред

рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рд╕реЗрд╡рд╛


рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХреА рдЧрдИ рдереАред рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рджреМрд░рд╛рди рдСрдЯреЛрдХреИрдирдлрд┐рдЧрд░реЗрд╢рди рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдВрддреНрд░рдХ рдХреЛрдб рд╣реИ:

 @RestController @RequestMapping(path = ["application-info"], produces = [MediaType.APPLICATION_JSON_UTF8_VALUE]) class ApplicationInfoController( private val applicationInfoService: ApplicationInfoService ) { @GetMapping fun get(@RequestParam("request-to") requestTo: String?): ApplicationInfo = applicationInfoService.get(requestTo) @GetMapping(path = ["/logo"], produces = [MediaType.IMAGE_PNG_VALUE]) fun getLogo(): ByteArray = applicationInfoService.getLogo() } 

Microservice рдПрдХ YAML рдлрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 spring: application: name: spring-boot-service server: port: 8084 application-info: name: ${spring.application.name} framework: name: Spring Boot release-year: 2014 

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЧреБрдг рд╕реНрд╡рд░реВрдк рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ (рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ )ред

рд▓рд╛рдВрдЪ


рдкрд░рд┐рдпреЛрдЬрдирд╛ JDK 12 рдкрд░ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг 11 рдкрд░ рднреА рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рд▓рд┐рдкрд┐рдпреЛрдВ рдореЗрдВ jvmTarget рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ jvmTarget рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛:

 withType<KotlinCompile> { kotlinOptions { jvmTarget = "12" ... } } 

Microservices рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдХреЙрдиреНрд╕рд▓ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдПрдЬреЗрдВрдЯ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣: consul agent -dev ред

рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рд╢реБрд░реВ рдХрд░рдирд╛ рдЗрд╕рд╕реЗ рд╕рдВрднрд╡ рд╣реИ:

  • рдЖрдИрдбреАрдИ
    IntelliJ IDEA рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдХреБрдЫ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

  • рд╕рд╛рдВрддреНрд╡рдирд╛
    рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

     java -jar helidon-service/build/libs/helidon-service-all.jar java -jar ktor-service/build/libs/ktor-service-all.jar java -jar micronaut-service/build/libs/micronaut-service-all.jar java -jar spring-boot-service/build/libs/spring-boot-service.jar 


http://localhost:8500/ui/dc1/services рдкрд░ рд╕рднреА рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж http://localhost:8500/ui/dc1/services рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ:



рдПрдкреАрдЖрдИ рдкрд░реАрдХреНрд╖рдг


рд╣реЗрд▓рд┐рджреЛрди рд╕реЗрд╡рд╛ рдПрдкреАрдЖрдИ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ:

  1. GET http://localhost:8081/application-info

     { "name": "helidon-service", "framework": { "name": "Helidon SE", "releaseYear": 2019 }, "requestedService": null } 
  2. GET http://localhost:8081/application-info?request-to=ktor-service

     { "name": "helidon-service", "framework": { "name": "Helidon SE", "releaseYear": 2019 }, "requestedService": { "name": "ktor-service", "framework": { "name": "Ktor", "releaseYear": 2018 }, "requestedService": null } } 
  3. GET http://localhost:8081/application-info/logo

    рдЫрд╡рд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдЖрдк рдкреЛрд╕реНрдЯрдореИрди (рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ ), IntelliJ IDEA HTTP рдХреНрд▓рд╛рдЗрдВрдЯ (рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ ), рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░, рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ microservice API рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рджреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рдЗрдХреНрд░реЛрдмрд╡рд░реНрдХ рдХреЗ рдкреЛрд░реНрдЯ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдЪрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдкреЛрд╕реНрдЯрдореИрди рдореЗрдВ рдпрд╣ рд╕рдВрдЧреНрд░рд╣ рдореЗрдиреВ рдореЗрдВ рд╣реИ -> рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ -> рдЪрд░ , рдФрд░ HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдореЗрдВ рд╣реИ, рдФрд░ рдЬрдм рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ 2) рдПрдкреАрдЖрдИ рдХреЛ "рд╣реБрдб рдХреЗ рддрд╣рдд" рдЕрдиреБрд░реЛрдз рдХреЗ рдирд╛рдо рдХреЛ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрддреНрддрд░ рдКрдкрд░ рджрд┐рдП рдЧрдП рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реЛрдВрдЧреЗред

рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рддреБрд▓рдирд╛



рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп рдЖрдХрд╛рд░


рдЕрд╕реЗрдВрдмрд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреА рд╕рд╛рджрдЧреА рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рд╕рдХрд░рд╛рддреНрдордХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдкрд░ uber-JAR рд╕реЗрд╡рд╛ рдХрд╛ рдЖрдХрд╛рд░ рдЕрдиреНрдп рдЪреМрдЦрдЯреЛрдВ рдкрд░ рдПрдирд╛рд▓реЙрдЧ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ (рд╢реБрд░реБрдЖрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ, рди рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдЖрдпрд╛рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ; рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рдЖрдХрд╛рд░ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ):
Mikroservisрд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп рдЖрдХрд╛рд░, рдПрдордмреА
рд╣реЗрд▓рд┐рдбрди рд╕реЗрд╡рд╛16.6
рдХреЛрдЯрд░ рд╕реЗрд╡рд╛20.9
рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рддреНрд░реА рд╕реЗрд╡рд╛16.5
рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рд╕реЗрд╡рд╛42.7


рд▓реЙрдиреНрдЪ рд╕рдордп


рдкреНрд░рддреНрдпреЗрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд▓реЙрдиреНрдЪ рд╕рдордп рдЕрд╕рдВрдЧрдд рд╣реИ рдФрд░ рдХреБрдЫ "рд╡рд┐рдВрдбреЛ" рдореЗрдВ рдЖрддрд╛ рд╣реИ; рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп рдХреЗ рд▓реЙрдиреНрдЪ рд╕рдордп рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИ:
MikroservisрдкреНрд░рд╛рд░рдВрдн рд╕рдордп, рд╕реЗрдХрдВрдб
рд╣реЗрд▓рд┐рдбрди рд╕реЗрд╡рд╛2.2
рдХреЛрдЯрд░ рд╕реЗрд╡рд╛1.4
рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рддреНрд░реА рд╕реЗрд╡рд╛4.0
рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рд╕реЗрд╡рд╛10.2

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЕрдирд╛рд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ "рдХреНрд▓реАрди" рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рд╕реНрдХреИрди рдХрд░реЗрдВ рдФрд░ рдЖрд▓рд╕реА рдмрд┐рди рдЖрд░рдВрднреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ), рддреЛ рдЖрдк рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╕рдордп рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЛрдб рдкрд░реАрдХреНрд╖рдг


рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдЧреИрдЯрд▓рд┐рдВрдЧ рдФрд░ рдПрдХ рд╕реНрдХрд╛рд▓рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЛрдб рдЬрдирд░реЗрдЯрд░ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рд╕реЗрд╡рд╛ рдПрдХ рд╣реА рдорд╢реАрди (рд╡рд┐рдВрдбреЛрдЬ 10, рдПрдХ рдХреНрд╡рд╛рдб-рдХреЛрд░ 3.2 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬ рдкреНрд░реЛрд╕реЗрд╕рд░, 24 рдЬреАрдмреА рд░реИрдо, рдПрд╕рдПрд╕рдбреА) рдкрд░ рдЪрд▓рд╛рдИ рдЧрдИ рдереАред рдЗрд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдкреЛрд░реНрдЯ рд╕реНрдХреЗрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ microservice рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  • рд╣реАрдк-рдореЗрдореЛрд░реА ( -Xmx ) рдХреА рдиреНрдпреВрдирддрдо рдорд╛рддреНрд░рд╛ рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ (рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм) рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ
  • рд▓реЛрдб рдкрд░реАрдХреНрд╖рдг 50 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ * 1000 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рд╣реАрдк рдореЗрдореЛрд░реА рдЖрд╡рд╢реНрдпрдХ рд╣реИ
  • рд▓реЛрдб рдкрд░реАрдХреНрд╖рдг 500 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ * 1000 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рд╣реАрдк рдореЗрдореЛрд░реА

рд▓реЛрдб рдЯреЗрд╕реНрдЯ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдордп рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рдХ рдиреЗ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ред
MikroservisрдвреЗрд░-рд╕реНрдореГрддрд┐ рдХреА рдиреНрдпреВрдирддрдо рдорд╛рддреНрд░рд╛, рдПрдо.рдмреА.
рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПрд▓реЛрдб рдХреЗ рд▓рд┐рдП 50 * 1000рд▓реЛрдб рдХреЗ рд▓рд┐рдП 500 * 1000
рд╣реЗрд▓рд┐рдбрди рд╕реЗрд╡рд╛9911
рдХреЛрдЯрд░ рд╕реЗрд╡рд╛111113
рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рддреНрд░реА рд╕реЗрд╡рд╛131317
рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рд╕реЗрд╡рд╛222325

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕рднреА рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕реЗрдЬ рдиреЗрдЯреНрдЯреА HTTP рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

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


рдХрд╛рд░реНрдп - HTTP рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реЗрд╡рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЖрдИрдПрд╕рдП рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ - рдкреНрд░рд╢реНрди рдореЗрдВ рд╕рднреА рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдпрд╣ рд╕реНрдЯреЙрдХ рд▓реЗрдиреЗ рдФрд░ рдЙрдирдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

Helidon

рдорд╛рдирдХ рд╕рдВрд╕реНрдХрд░рдг
  • рдкреЗрд╢реЗрд╡рд░реЛрдВ
    • рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕
      рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдИ рджрд┐рдП;
    • "рдХреЛрдИ рдСрдбрд┐рдпреЛ рдирд╣реАрдВ"
      рдврд╛рдВрдЪрд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдП рдЧрдП рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рддрд╛ рд╣реИ: рдПрдкреНрд▓рд┐рдХреЗрд╢рди ( @JvmStatic - Java-Kotlin interope) рдХреЗ рд▓рд┐рдП рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рд▓рд┐рдпрд╛ рдЧрдпрд╛ред
  • рд╡рд┐рдкрдХреНрд╖
    • microframework
      рдФрджреНрдпреЛрдЧрд┐рдХ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреБрдЫ рдШрдЯрдХ рдмреЙрдХреНрд╕ рд╕реЗ рдЧрд╛рдпрдм рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдФрд░ рд╕реЗрд╡рд╛ рдбрд┐рд╕реНрдХрд╡рд░реА рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред

MicroProfile
рдЗрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкрд░ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрд░реНрдлрд╝ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рдЙрди рджреЛ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдБ рдЬреЛ рдореБрдЭреЗ рдкрддрд╛ рд╣реИрдВ

  • рдкреЗрд╢реЗрд╡рд░реЛрдВ
    • рдЧреНрд░рд╣рдг рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
      рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдЬрд╛рд╡рд╛ рдИрдИ рдЖрдИрдПрд╕рдП рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк рдЬрд╛рд╡рд╛ рдИрдИ рдПрдкреАрдЖрдИ рдХреА рд╕рдВрдкреВрд░реНрдг рд╡рд┐рд╡рд┐рдзрддрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдИрдПрд╕рдП рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд▓реЛрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЖрдк рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдУрдкрди рд▓рд┐рдмрд░реНрдЯреА, рд╡рд╛рдЗрд▓реНрдбрд▓реА рдЭреБрдВрдб, рдЖрджрд┐) ред
  • рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА
    • рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдкрд░ рдЖрдк рдЕрдиреНрдп рдлреНрд░реЗрдорд╡рд░реНрдХ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдкреНрд░рд┐рдВрдЧ рдкреНрд░реАрд▓рд┐рдлрд╝рд░ ) рдХреЗ рд╕рдорд╛рди рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЦрд░реЛрдВрдЪ рд╕реЗ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдЦ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд╕рдордп, рд╣реЗрд▓рд┐рдбреЛрди рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ 1.2 рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг 3.0 рд╣реИред


Ktor

  • рдкреЗрд╢реЗрд╡рд░реЛрдВ
    • рд▓рдкрдЯ
      рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ;
    • рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕
      рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдоред
  • рд╡рд┐рдкрдХреНрд╖
    • рдХреЛрдЯрд▓рд┐рди рдХреЗ рддрд╣рдд "рддреЗрдЬ", рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╛рд╡рд╛ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ;
    • рдорд╛рдЗрдХреНрд░реЛрдлреНрд░рд╛рдорд╡рд░реНрдХ (рд╣реЗрд▓рд┐рдбрди рдПрд╕рдИ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЖрдЗрдЯрдо рджреЗрдЦреЗрдВ)ред
  • рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА
    рдПрдХ рддрд░рдл, рджреЛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдореЙрдбрд▓ (рд╕реНрдкреНрд░рд┐рдВрдЧ-рд▓рд╛рдЗрдХ (рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ / рдорд╛рдЗрдХреНрд░реЛрдиреНрдпреВрдЯ) рдФрд░ рдЬрд╛рд╡рд╛ рдИрдИ / рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓) рдореЗрдВ рдлреНрд░реЗрдорд╡рд░реНрдХ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХреЙрдиреНрд╕реЗрдкреНрдЯ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

    • рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛;
    • рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХрд╛ рдЕрдзрд┐рдХ рд╕рдордпред

    рджреВрд╕рд░реА рдУрд░, "рдХреНрд▓рд╛рд╕рд┐рдХ" рд╕реНрдкреНрд░рд┐рдВрдЧ рдФрд░ рдЬрд╛рд╡рд╛ рдИрдИ рдХреЗ рдкреНрд░рддрд┐ рдЕрд╕рд╣рдорддрд┐ рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рдХреЛрдг рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рд╕рдЪреЗрдд рд░реВрдк рд╕реЗред


Micronaut

  • рдкреЗрд╢реЗрд╡рд░реЛрдВ
    • AOT
      рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдУрдЯреА рдЖрдкрдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдкрд░ рдЕрдкрдиреЗ рд╕рдордХрдХреНрд╖ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЙрдкрднреЛрдЧ рдХрд┐рдП рдЧрдП рд╢реБрд░реБрдЖрддреА рд╕рдордп рдФрд░ рдореЗрдореЛрд░реА рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ;
    • рд╕реНрдкреНрд░рд┐рдВрдЧ рдЬреИрд╕рд╛ рд╡рд┐рдХрд╛рд╕ рдореЙрдбрд▓
      рд╡рд╕рдВрдд рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрднрд╡ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЗрд╕ рдврд╛рдВрдЪреЗ рдХреЛ рдорд╛рд╕реНрдЯрд░ рдХрд░рдиреЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рд╕рдордп рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛;
    • рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕
      рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо;
    • рдмрд╣реБрднрд╛рд╖реА
      рдЬрд╛рд╡рд╛, рдХреЛрдЯрд▓рд┐рди, рдЧреНрд░реВрд╡реА рдХреЗ рд▓рд┐рдП рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рдирд╛рдЧрд░рд┐рдХ рд╕рдорд░реНрдерди; рд╢рд╛рдпрдж рд╕реНрдХрд╛рд▓рд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реЛрдЧрд╛ред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рд╡рд┐рдХрд╛рд╕ рдХреЛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡реИрд╕реЗ, рдЬреВрди 2019 рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреА рд░реИрдВрдХрд┐рдВрдЧ рдореЗрдВ рдЧреНрд░реВрд╡реА 14 рд╡реЗрдВ рд╕реНрдерд╛рди рдкрд░ рд╣реИ, 60 рд╡реЗрдВ рд╡рд░реНрд╖ рд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЬреЗрд╡реАрдПрдо рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдореНрдорд╛рдирдЬрдирдХ рджреВрд╕рд░реЗ рд╕реНрдерд╛рди рдкрд░ рд╣реИ;
    • рд╕реНрдкреНрд░рд┐рдВрдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдХреНрд░реЛрдиреЙрдЯ рднреА рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдореМрдЬреВрджрд╛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд░рдирдЯрд╛рдЗрдо рдХреЛ рдорд╛рдЗрдХреНрд░реЛрдиреЙрдЯ (рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде) рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рд╡рд╕рдВрдд рдХрд╛ рдмреВрдЯ

  • рдкреЗрд╢реЗрд╡рд░реЛрдВ
    • рдордВрдЪ рдкрд░рд┐рдкрдХреНрд╡рддрд╛ рдФрд░ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░
      "рд╣рд░ рджрд┐рди" рд░реВрдкрд░реЗрдЦрд╛ред рдЕрдзрд┐рдХрд╛рдВрд╢ рд░реЛрдЬрд╝рдорд░реНрд░рд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕реНрдкреНрд░рд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░рддрд┐рдорд╛рди рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЬреЛ рдХрд┐ рдПрдХ рддрд░рд╣ рд╕реЗ рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИред рд╢реБрд░реБрдЖрдд рдФрд░ рдСрдЯреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╛рд╕ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ;
    • рд╢реНрд░рдо рдмрд╛рдЬрд╛рд░ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐, рд╕рд╛рде рд╣реА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬреНрдЮрд╛рди рдХрд╛ рдЖрдзрд╛рд░ (рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдФрд░ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдХреЗ рдЬрд╡рд╛рдм рд╕рд╣рд┐рдд);
    • рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп
      рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рд╕рд╣рдордд рд╣реЛрдВрдЧреЗ рдХрд┐ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╡рд╕рдВрдд рдЕрдЧреНрд░рдгреА рд╡рд┐рдХрд╛рд╕ рдврд╛рдВрдЪрд╛ рдмрдирд╛ рд░рд╣реЗрдЧрд╛ред
  • рд╡рд┐рдкрдХреНрд╖
    • рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕
      рдЗрд╕ рдврд╛рдВрдЪреЗ рдкрд░ рдЖрд╡реЗрджрди рдиреЗрддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдирд╣реАрдВ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреБрдЫ рдорд╛рдкрджрдВрдбреЛрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рднреА рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЬреЛ рд╕рдХреНрд░рд┐рдп рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдзреАрди рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред

рдЖрдк рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдо рд╕реЗ рдЧрд╛рдпрдм рдирдИ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рд╕реЗ рдЬреБрдбрд╝реА рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рднреА рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдХрдо рд╡рд┐рдХрд╕рд┐рдд рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░;
  • рдЗрди рддрдХрдиреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреА рдПрдХ рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛;
  • рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдордп;
  • рдЕрд╕реНрдкрд╖реНрдЯ рд╕рдВрднрд╛рд╡рдирд╛рдПрдБред

рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рдЬрди рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд╣реИрдВ: рд╣реЗрд▓рд┐рдбрди рдПрд╕рдИ рдФрд░ рдХреЗрдУрдЖрд░ рдорд╛рдЗрдХреНрд░реЛрдлреНрд░реЗрдо рд╣реИрдВ , рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдПрдХ рдкреВрд░реНрдг-рд╕реНрдЯреИрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИ, рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рдЕрдзрд┐рдХ рдкреВрд░реНрдг-рд╕реНрдЯреИрдХ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ; рдПрдХ рдЕрдиреНрдп рд╢реНрд░реЗрдгреА рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдлрд╛рдЗрд▓ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣реЗрд▓рд┐рдбреЙрди рдПрдордкреА) рд╣реИред рдорд╛рдЗрдХреНрд░реЛрдлрд╝реНрд░реЗрдо рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реАрдорд┐рдд рд╣реИ, рдЬреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдзреАрдорд╛ рдХрд░ рд╕рдХрддреА рд╣реИ; рдХрд┐рд╕реА рднреА рд╡рд┐рдХрд╛рд╕ рдврд╛рдВрдЪреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕ рдпрд╛ рдЙрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВред

рдореИрдВ рдпрд╣ рдЬрдЬ рдХрд░рдиреЗ рдХреА рд╣рд┐рдореНрдордд рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рдпрд╣ рдпрд╛ рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдлреНрд░реЗрдорд╡рд░реНрдХ "рд╢реВрдЯ" рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХрд╛рдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрджрд╛ рд╡рд┐рдХрд╛рд╕ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

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

рдЖрдк GitHub рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдкреБрдирд╢реНрдЪ: рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░реНрдЯрдЧреНрд▓реЛрд░рд┐рди рдХреЛ рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/hi456376/


All Articles