Котлин
xxxxxxxxxx
1
private fun createRouting(applicationInfoService: ApplicationInfoService) = Routing.builder()
2
.register(JacksonSupport.create())
3
.get("/application-info", Handler { req, res ->
4
val requestTo: String? = req.queryParams()
5
.first("request-to")
6
.orElse(null)
7
res
9
.status(Http.ResponseStatus.create(200))
10
.send(applicationInfoService.get(requestTo))
11
})
12
.get("/application-info/logo", Handler { req, res ->
13
res.headers().contentType(MediaType.create("image", "png"))
14
res
15
.status(Http.ResponseStatus.create(200))
16
.send(applicationInfoService.getLogo())
17
})
18
.error(Exception::class.java) { req, res, ex ->
19
log.error("Exception:", ex)
20
res.status(Http.Status.INTERNAL_SERVER_ERROR_500).send()
21
}
22
.build()
JSON
xxxxxxxxxx
1
webserver {
2
port: 8081
3
}
4
application-info {
6
name: "helidon-service"
7
framework {
8
name: "Helidon SE"
9
release-year: 2019
10
}
11
}
JSON
xxxxxxxxxx
1
ktor {
2
deployment {
3
host = localhost
4
port = 8082
5
environment = prod
6
// for dev purpose
7
autoreload = true
8
watch = [io.heterogeneousmicroservices.ktorservice]
9
}
10
application {
11
modules = [io.heterogeneousmicroservices.ktorservice.module.KtorServiceApplicationModuleKt.module]
12
}
13
}
14
application-info {
16
name: "ktor-service"
17
framework {
18
name: "Ktor"
19
release-year: 2018
20
}
21
}
Котлин
xxxxxxxxxx
1
fun Application.module() {
2
val applicationInfoService: ApplicationInfoService by inject()
3
if (!isTest()) {
5
val consulClient: Consul by inject()
6
registerInConsul(applicationInfoService.get(null).name, consulClient)
7
}
8
install(DefaultHeaders)
10
install(Compression)
11
install(CallLogging)
12
install(ContentNegotiation) {
13
jackson {}
14
}
15
routing {
17
route("application-info") {
18
get {
19
val requestTo: String? = call.parameters["request-to"]
20
call.respond(applicationInfoService.get(requestTo))
21
}
22
static {
23
resource("/logo", "logo.png")
24
}
25
}
26
}
27
}
Котлин
xxxxxxxxxx
1
fun getApplicationInfo(serviceName: String): ApplicationInfo = runBlocking {
2
httpClient.get<ApplicationInfo>("http://$serviceName/application-info")
3
}
Котлин
xxxxxxxxxx
1
@Controller(
2
value = "/application-info",
3
consumes = [MediaType.APPLICATION_JSON],
4
produces = [MediaType.APPLICATION_JSON]
5
)
6
class ApplicationInfoController(
7
private val applicationInfoService: ApplicationInfoService
8
) {
9
@Get
11
fun get(requestTo: String?): ApplicationInfo = applicationInfoService.get(requestTo)
12
@Get("/logo", produces = [MediaType.IMAGE_PNG])
14
fun getLogo(): ByteArray = applicationInfoService.getLogo()
15
}
Котлин
xxxxxxxxxx
1
plugins {
2
...
3
kotlin("kapt")
4
...
5
}
6
dependencies {
8
kapt("io.micronaut:micronaut-inject-java:$micronautVersion")
9
...
10
kaptTest("io.micronaut:micronaut-inject-java:$micronautVersion")
11
...
12
}
YAML
xxxxxxxxxx
1
micronaut
2
application
3
name micronaut-service
4
server
5
port8083
6
consul
8
client
9
registration
10
enabledtrue
11
application-info
13
name $ micronaut.application.name
14
framework
15
name Micronaut
16
release-year2018
Котлин
xxxxxxxxxx
1
@ApplicationScoped
2
class ApplicationInfoService(
3
...
4
) {
5
...
6
}
Котлин
xxxxxxxxxx
1
@ApplicationScoped
2
@Path("/")
3
interface ExternalServiceClient {
4
@GET
5
@Path("/application-info")
6
@Produces("application/json")
7
fun getApplicationInfo(): ApplicationInfo
8
}
9
@RegisterRestClient(baseUri = "http://helidon-service")
11
interface HelidonServiceClient : ExternalServiceClient
12
@RegisterRestClient(baseUri = "http://ktor-service")
14
interface KtorServiceClient : ExternalServiceClient
15
@RegisterRestClient(baseUri = "http://micronaut-service")
17
interface MicronautServiceClient : ExternalServiceClient
18
@RegisterRestClient(baseUri = "http://quarkus-service")
20
interface QuarkusServiceClient : ExternalServiceClient
21
@RegisterRestClient(baseUri = "http://spring-boot-service")
23
interface SpringBootServiceClient : ExternalServiceClient
Котлин
xxxxxxxxxx
1
@ApplicationScoped
2
class ConsulRegistrationBean(
3
@Inject private val consulClient: ConsulClient
4
) {
5
fun onStart(@Observes event: StartupEvent) {
7
consulClient.register()
8
}
9
}
Котлин
xxxxxxxxxx
1
@Provider
2
@ApplicationScoped
3
class ConsulFilter(
4
@Inject private val consulClient: ConsulClient
5
) : ClientRequestFilter {
6
override fun filter(requestContext: ClientRequestContext) {
8
val serviceName = requestContext.uri.host
9
val serviceInstance = consulClient.getServiceInstance(serviceName)
10
val newUri: URI = URIBuilder(URI.create(requestContext.uri.toString()))
11
.setHost(serviceInstance.address)
12
.setPort(serviceInstance.port)
13
.build()
14
requestContext.uri = newUri
16
}
17
}
YAML
xxxxxxxxxx
1
spring
2
application
3
name spring-boot-service
4
server
6
port8085
7
application-info
9
name $ spring.application.name
10
framework
11
name Spring Boot
12
release-year2014
-
концепция развития
-
С одной стороны, среда не включена в две наиболее популярные модели разработки Java (Spring-like (Spring Boot / Micronaut) и Java EE / MicroProfile), что может привести к:
-
проблема с поиском специалистов
-
увеличение времени выполнения задач по сравнению с Spring Boot из-за необходимости явной настройки требуемой функциональности
-
-
С другой стороны, отличие от «классической» Spring и Java EE позволяет взглянуть на процесс разработки под другим углом, возможно, более осознанно
-
Micronaut
-
Pros
-
AOT - Как отмечалось ранее, AOT может уменьшить время запуска и потребление памяти приложением по сравнению с аналогом в Spring Boot
-
Spring-like модель разработки - программистам с опытом работы с Spring Framework не потребуется много времени, чтобы освоить эту среду
-
Параметры приложения - Хорошие результаты для всех параметров
-
-
Дополнительно:
-
Проект Micronaut for Spring позволяет, помимо прочего, изменить среду выполнения существующего приложения Spring Boot на Micronaut (с ограничениями)
-
Quarkus
-
Pros
-
Внедрение Eclipse MicroProfile. Смотри Хелидон М.П.
-
Параметры приложения - Хорошие результаты для всех параметров
-
-
Дополнительно:
Весенний ботинок
-
Pros
-
Зрелость платформы и экосистема - это основа на каждый день. Для большинства повседневных задач в парадигме программирования Spring уже есть решение, то есть способ, к которому привыкли многие программисты. Кроме того, разработка упрощается за счет концепции стартеров и автоматической настройки
-
Большое количество специалистов на рынке труда, а также значительная база знаний (включая документацию и ответы по переполнению стека)
-
Перспектива - я думаю, что многие согласятся, что Spring останется ведущей средой Java / Kotlin в ближайшем будущем.
-
-
Cons
-
Параметры приложения - Приложение в этом фреймворке не входило в число лидеров, однако по некоторым параметрам, как отмечалось ранее, вы можете оптимизировать себя. Также стоит помнить о наличии проекта Spring Fu , который находится в активной разработке и использование которого снижает эти параметры
-
Кроме того, мы можем выделить типичные проблемы, которые возникают в новых платформах, но Spring Boot этого не делает:
-
Менее развитая экосистема
-
Мало специалистов с опытом работы с этими технологиями
-
Более длительное время выполнения задач
-
Неясные перспективы
Рассмотренные структуры относятся к разным разделам веса: Helidon SE и Ktor является microframeworks ; Spring Boot и Micronaut - фреймворки с полным стеком; Quarkus и Helidon MP - это фреймворки MicroProfile. Функциональность микрофреймера ограничена, что может замедлить развитие. Чтобы прояснить возможность реализации определенной функциональности на основе конкретной платформы, я рекомендую вам ознакомиться с ее документацией.
Я не смею судить о том, «выстрелит» та или иная структура в ближайшем будущем, поэтому, на мой взгляд, на данный момент лучше продолжать наблюдать за развитием событий, используя существующую среду для решения рабочих задач.
В то же время, как было показано в статье, новые фреймворки выигрывают Spring Boot по рассмотренным параметрам приложений. Если какой-либо из этих параметров критически важен для одного из ваших микросервисов, то, возможно, стоит обратить внимание на платформы, которые показали лучшие результаты. Однако не следует забывать, что Spring Boot, во-первых, продолжает улучшаться, а во-вторых, у него огромная экосистема и значительное количество Java-программистов, знакомых с ней. Наконец, существуют другие фреймворки, не описанные в этой статье: Vert.x, Javalin и т. Д.
Спасибо за чтение!
PS Спасибо artglorin за помощь в этой статье