рдХреНрд╡рд╛рд░реНрдХрд╕, рдХреЛрдЯрд▓рд┐рди рдФрд░ рдЧреНрд░реИрдбрд▓ рдкрд░ рдПрдХ рдорд╛рдЗрдХреНрд░реЛ рд╕рд░реНрд╡рд┐рд╕ рдмрдирд╛рдирд╛


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


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


рд▓рдХреНрд╖реНрдп рд╡рд╛рд╕реНрддреБрдХрд▓рд╛


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред


рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:



рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ


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


zavismosti


рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдЧреНрд░реИрдбрд▓ рдХреЛрдЯрд▓рд┐рди рдбреАрдПрд╕рдПрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд┐рд▓реНрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:


  • рдкреНрд▓рдЧ-рдЗрди
    рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 1. build.gradle.kts


    plugins { kotlin("jvm") kotlin("plugin.allopen") id("io.quarkus") } 

    рдкреНрд▓рдЧрдЗрди рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдХрд▓реНрдк settings.gradle.kts рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


  • рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ
    рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 2. build.gradle.kts


     dependencies { ... implementation(enforcedPlatform("io.quarkus:quarkus-bom:$quarkusVersion")) implementation("io.quarkus:quarkus-resteasy-jackson") implementation("io.quarkus:quarkus-rest-client") implementation("io.quarkus:quarkus-kotlin") implementation("io.quarkus:quarkus-config-yaml") testImplementation("io.quarkus:quarkus-junit5") ... } 

    Maven BOM рдХреЗ рдЖрдпрд╛рдд рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЧреНрд░реИрдбрд▓ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред



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


рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 3. build.gradle.kts


 allOpen { annotation("javax.enterprise.context.ApplicationScoped") } 

рдХрд╛ рд╡рд┐рдиреНрдпрд╛рд╕


рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдФрд░ YAML рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ
( рдХреНрд╡рд╛рд░реНрдХрд╕ рдХреЙрдиреНрдлрд┐рдЧ рдЧрд╛рдЗрдб рдореЗрдВ рдЕрдзрд┐рдХ)ред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ resources рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 4. application.yaml


 quarkus: http: host: localhost port: 8084 application-info: name: quarkus-service framework: name: Quarkus release-year: 2019 

рдЗрд╕ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ, microservice рдХреЗ рдорд╛рдирдХ рдФрд░ рдХрд╕реНрдЯрдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 5. рд░реАрдбрд┐рдВрдЧ рдХрд╕реНрдЯрдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ ( рд╕реНрд░реЛрдд рдХреЛрдб )


 import io.quarkus.arc.config.ConfigProperties @ConfigProperties(prefix = "application-info") class ApplicationInfoProperties { lateinit var name: String lateinit var framework: FrameworkConfiguration class FrameworkConfiguration { lateinit var name: String lateinit var releaseYear: String } } 

рдмреАрдирд╛


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрд╡рд╛рд░реНрдХрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдХреЛрдИ рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреНрд░рдХрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред


рдкрд┐рдЫрд▓реЗ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рд╕реЗ @ConfigProperties рдмреАрди рдХреЛ рджреВрд╕рд░реА рдмреАрди рдореЗрдВ @Inject рдХрд░рдирд╛ @Inject рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 6. @ConfigProperties рдмреАрди ( рд╕реНрд░реЛрдд ) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛


 @ApplicationScoped class ApplicationInfoService( @Inject private val applicationInfoProperties: ApplicationInfoProperties, @Inject private val serviceClient: ServiceClient ) { ... } 

ApplicationInfoService рдмреАрди рджреНрд╡рд╛рд░рд╛ @ApplicationScoped , рдмрджрд▓реЗ рдореЗрдВ, рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 7. @ApplicationScoped рдХреЛ @ApplicationScoped рдмреАрди ( рд╕реНрд░реЛрдд )


 class ApplicationInfoResource( @Inject private val applicationInfoService: ApplicationInfoService ) 

рдХреНрд╡рд╛рд░реНрдХрд╕ рд╕реАрдбреАрдЖрдИ рдЧрд╛рдЗрдб рдореЗрдВ рдХреЙрдирдЯреЗрдХреНрд╕ рдФрд░ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реАред


рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдХ


рд╕реНрдкреНрд░рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рдпрд╛ рдЬрд╛рд╡рд╛ EE рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП REST рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдХреБрдЫ рднреА рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИ:


рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 8. рдмрд╛рдХреА рдирд┐рдпрдВрддреНрд░рдХ ( рд╕реНрд░реЛрдд )


 @Path("/application-info") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) class ApplicationInfoResource( @Inject private val applicationInfoService: ApplicationInfoService ) { @GET fun get(@QueryParam("request-to") requestTo: String?): Response = Response.ok(applicationInfoService.get(requestTo)).build() @GET @Path("/logo") @Produces("image/png") fun logo(): Response = Response.ok(applicationInfoService.getLogo()).build() } 

рдЕрдиреНрдп рдЧреНрд░рд╛рд╣рдХ


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


рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 9. рдЕрдиреНрдп рдЧреНрд░рд╛рд╣рдХреЛрдВ ( рд╕реНрд░реЛрдд рдХреЛрдб )


 @ApplicationScoped @Path("/") interface ExternalServiceClient { @GET @Path("/application-info") @Produces("application/json") fun getApplicationInfo(): ApplicationInfo } @RegisterRestClient(baseUri = "http://helidon-service") interface HelidonServiceClient : ExternalServiceClient @RegisterRestClient(baseUri = "http://ktor-service") interface KtorServiceClient : ExternalServiceClient @RegisterRestClient(baseUri = "http://micronaut-service") interface MicronautServiceClient : ExternalServiceClient @RegisterRestClient(baseUri = "http://quarkus-service") interface QuarkusServiceClient : ExternalServiceClient @RegisterRestClient(baseUri = "http://spring-boot-service") interface SpringBootServiceClient : ExternalServiceClient 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ REST рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдирд╛, рд╕рдВрдмрдВрдзрд┐рдд JAX-RS рдФрд░ MicroProfile рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдирд╛ рд╣реИред


рд╕реЗрд╡рд╛ рдЦреЛрдЬ


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


рдХреМрдВрд╕рд▓ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, register рдФрд░ getServiceInstance (рд░рд╛рдЙрдВрдб-рд░реЙрдмрд┐рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ):


рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 10. рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдХреМрдВрд╕рд▓ ( рд╕реНрд░реЛрдд )


 @ApplicationScoped class ConsulClient( @ConfigProperty(name = "application-info.name") private val serviceName: String, @ConfigProperty(name = "quarkus.http.port") private val port: Int ) { private val consulUrl = "http://localhost:8500" private val consulClient by lazy { Consul.builder().withUrl(consulUrl).build() } private var serviceInstanceIndex: Int = 0 fun register() { consulClient.agentClient().register(createConsulRegistration()) } fun getServiceInstance(serviceName: String): Service { val serviceInstances = consulClient.healthClient().getHealthyServiceInstances(serviceName).response val selectedInstance = serviceInstances[serviceInstanceIndex] serviceInstanceIndex = (serviceInstanceIndex + 1) % serviceInstances.size return selectedInstance.service } private fun createConsulRegistration() = ImmutableRegistration.builder() .id("$serviceName-$port") .name(serviceName) .address("localhost") .port(port) .build() } 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЖрд╡реЗрджрди рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 11. рдХрдВрд╕рд▓ ( рд╕реНрд░реЛрдд ) рдХреЗ рд╕рд╛рде рдкрдВрдЬреАрдХрд░рдг


 @ApplicationScoped class ConsulRegistrationBean( @Inject private val consulClient: ConsulClient ) { fun onStart(@Observes event: StartupEvent) { consulClient.register() } } 

рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдирд╛рдо рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд╛рди рдкрд░ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ @Provider рдФрд░ рдПрдиреЛрдЯреЗрдЯ @Provider рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ:


рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 12. рд╕реЗрд╡рд╛ рдбрд┐рд╕реНрдХрд╡рд░реА ( рд╕реНрд░реЛрдд ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд┐рд▓реНрдЯрд░


 @Provider @ApplicationScoped class ConsulFilter( @Inject private val consulClient: ConsulClient ) : ClientRequestFilter { override fun filter(requestContext: ClientRequestContext) { val serviceName = requestContext.uri.host val serviceInstance = consulClient.getServiceInstance(serviceName) val newUri: URI = URIBuilder(URI.create(requestContext.uri.toString())) .setHost(serviceInstance.address) .setPort(serviceInstance.port) .build() requestContext.uri = newUri } } 

рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗрд╡рд▓ requestContext рдХреЗ URI рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдХреЙрдиреНрд╕реБрд▓ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╕реЗрд╡рд╛ рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддрд╛ рд╣реИред


рдкрд░реАрдХреНрд╖рдг


REST рдПрд╢реНрдпреЛрд░реНрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЛ API рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЯреЗрд╕реНрдЯ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:


рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 13. рдЯреЗрд╕реНрдЯ ( рд╕реНрд░реЛрдд )


 @QuarkusTest class QuarkusServiceApplicationTest { @Test fun testGet() { given() .`when`().get("/application-info") .then() .statusCode(200) .contentType(ContentType.JSON) .body("name") { `is`("quarkus-service") } .body("framework.name") { `is`("Quarkus") } .body("framework.releaseYear") { `is`(2019) } } @Test fun testGetLogo() { given() .`when`().get("/application-info/logo") .then() .statusCode(200) .contentType("image/png") .body(`is`(notNullValue())) } } 

рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рдХреЙрдиреНрд╕рд▓ рдХреЗ рд╕рд╛рде рдЖрд╡реЗрджрди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ, ConsulClientMock , рдЬреЛ ConsulClient рд╡рд┐рд╕реНрддрд╛рд░ ConsulClient :


рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 14. ConsulClient рд▓рд┐рдП рдирдХрд▓реА ( рд╕реНрд░реЛрдд )


 @Mock @ApplicationScoped class ConsulClientMock : ConsulClient("", 0) { // do nothing override fun register() { } } 

рд╕рднрд╛


quarkusBuild build рдХрд╛рд░реНрдп рдХреЗ рджреМрд░рд╛рди, quarkusBuild рдХрд╛рд░реНрдп quarkusBuild ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдПрдХ рд░рдирд░ JAR рдФрд░ рдПрдХ lib рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╕реНрдерд┐рдд рд╣реЛрддреА рд╣реИрдВред Uber-JAR рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, quarkusBuild рдХрд╛рд░реНрдп рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ quarkusBuild рдЪрд╛рд╣рд┐рдП:


рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 15. uber-JAR рдкреАрдврд╝реА ( рд╕реНрд░реЛрдд ) рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛


 tasks { withType<QuarkusBuild> { isUberJar = true } } 

рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓рд╛рдПрдБ ./gradlew clean build рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдореВрд▓ рдореЗрдВ ./gradlew clean build ред


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


Microservice рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ Consul ( рдореБрдЦреНрдп рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд) рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


Microservice рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


  • quarkusDev рдХрд╛рд░реНрдп
    рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЬрдбрд╝ рдореЗрдВ рдЪрд▓рд╛рдПрдБ:
    ./gradlew :quarkus-service:quarkusDev
    рдпрд╛ IDE рдореЗрдВ рдХрд╛рд░реНрдп рдЪрд▓рд╛рдПрдБ
  • uber-рдЬрд╛рд░
    рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЬрдбрд╝ рдореЗрдВ рдЪрд▓рд╛рдПрдБ:
    java -jar quarkus-service/build/quarkus-service-1.0.0-runner.jar

рдЕрдм рдЖрдк REST API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреНрд╡реЗрд░реА рдЪрд▓рд╛рдПрдБ:


GET http://localhost:8084/application-info


рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛:


рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 16. рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХрд╛ рдкрд░рд┐рдгрд╛рдо


 { "name": "quarkus-service", "framework": { "name": "Quarkus", "releaseYear": 2019 }, "requestedService": null } 

рд╡рд╕рдВрдд рдХреА рдЕрдиреБрдХреВрд▓рддрд╛


DI рд╡рд╕рдВрдд, рд╡реЗрдм , рд╕реБрд░рдХреНрд╖рд╛ , рдбреЗрдЯрд╛ JPA : рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрдИ рд╕реНрдкреНрд░рд┐рдВрдЧ рддрдХрдиреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред


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


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


рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ



PS рд▓реЗрдЦ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж vladimirsitnikov ред

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


All Articles