[Программирование, Java, Kotlin, Gradle, Микросервисы] Шаблон Kotlin микросервисов
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Для разработчиков не секрет, что создание нового сервиса влечет за собой немало рутиной настройки: билд скрипты, зависимости, тесты, docker, k8s дескрипторы. Раз мы выполняем эту работу, значит текущих шаблонов IDE недосточно. Под катом мои попытки автоматизировать все до одной кроссплатформенной кнопки "сделать хорошо" сопровождаемые кодом, примерами и финальным результатом.
Если перспективы создания сервисов в один клик с последующим автоматическим деплоем в Digital Ocean звучат заманчиво, значит эта статья для вас.
Начнем создавать наш шаблон и прежде всего рассмотрим организацию сборки. Несмотря на любовь многих к maven за его простоту и декларативность, использовать будем gradle, ибо он современее и позволяет писать скрипт сборки на одном языке с проектом. Помимо самого Kotlin плагина, нам потребуется еще два:
plugins {
kotlin("jvm") version "1.4.30"
// Чтобы собрать fat jar
id("com.github.johnrengelman.shadow") version "6.1.0"
// Чтобы собрать self-executable приложение с jvm
id("org.beryx.runtime") version "1.12.1"
}
Из зависимостей, в качестве серверного фреймворка был выбран "родной" для Kotlin Ktor. Для тестирования используется связка testNG + Hamkrest с его выразительным DSL, позволяющим писать тесты таким образом:
assertThat("xyzzy", startsWith("x") and endsWith("y") and !containsSubstring("a"))
Собираем все вместе, ориентируясь на Java 15+
dependencies {
// для парсинга аргументов командой строки
implementation("com.github.ajalt.clikt:clikt:3.1.0")
implementation("io.ktor:ktor-server-netty:1.5.1")
testImplementation("org.testng:testng:7.3.0")
testImplementation("com.natpryce:hamkrest:1.8.0.1")
testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0")
}
application {
@Suppress("DEPRECATION") // for compatibility with shadowJar
mainClassName = "AppKt"
}
tasks {
test {
useTestNG()
}
compileKotlin {
kotlinOptions {
jvmTarget = "15"
}
}
}
В исходный код генерируемый шаблоном по умолчанию добавлен entry-point обработки аргументов командой строки, заготовка ддя роутинга, и простой тест (заодно служащий примером использоования testNG с Hamkrest).
Из того что следует отметить, позволил себе небольшую вольность с официальным Kotlin codestyle чуть-чуть поправив его в .editorsconfig:
[*.{kt, kts, java, xml, html, js}]
max_line_length = 120
indent_size = 2
continuation_indent_size = 2
В первую очередь, это вопрос вкуса, но ещё так в одну строчку помещается больше кода, что помогает избежать переноса в выражениях внутри класса и функции, лямбды, например.
Чтобы собрать self-executable jar используйте команду
gradle clean test shadowJar
На этом этапе приложение уже можно использовать, запуская традиционным образом.
Осталось написать Dockerfile, его привожу целиком. Сборка и запуск разделены и производятся в два этапа:
# syntax = docker/dockerfile:experimental
FROM gradle:jdk15 as builder
WORKDIR /app
COPY src ./src
COPY build.gradle.kts ./build.gradle.kts
RUN --mount=type=cache,target=./.gradle gradle clean test shadowJar
FROM openjdk:15-alpine as backend
WORKDIR /root
COPY --from=builder /app/*.jar ./app
Работать сервис будет в контейнере с jdk (а не jvm), ради простоты ручной диагностики с помощью jstack/jmap и других поставляемых с jdk инструментов.
Сконфигурируем запуск приложения при помощи Docker Compose:
version: "3.9"
services:
backend:
build: .
command: java -jar app $BACKEND_OPTIONS
ports:
- "80:80"
Теперь мы можем запускать наш сервис на целевой машине, без дополнительных зависимостей в виде Jdk/Gradle, при помощи простой команды
docker-compose up
Как деплоить сервис в облако? Выбрал Digital Ocean по причине дешевой стоимости и простоты управления. Благодаря тому что мы только что сконфигурировали сборку и запуск в контейнере, можно выбрать наш репозиторий с проектом в разделе Apps Platform и... все! Файлы конфигурации Docker будут подцеплены автоматически, мы увидим логи сборки, а после этого получим доступ к веб адресу, логам приложения, консоли управления, простым метрикам потребления памяти и процессорного времени. Выглядит это удовольствие примерно так и стоит 5$ в месяц:
При последующих изменениях в master ветке репозитория, передеплой запустится автоматически. Очень удобно. И наконец, все описанное в статье, подробно задокументировано в README.md файле шаблона проекта, чтобы после создания последующая сборка и деплой не вызывали сложностей.
Исползьовать описаный шаблон чтобы получить готовый репозиторий, можно просто нажав кнопочку "Use this template"на GitHub:
github.com/demidko/Projekt
Или, если вам нужен варинт с портабельным jvm:
github.com/demidko/Projekt-portable
После этого остается только написать логику :) Как и любой подход, этот шаблон не лишен недостатков, поэтому интересно услышать предложения, комментарии и критику.
===========
Источник:
habr.com
===========
Похожие новости:
- [Ненормальное программирование, Ruby, Программирование, Go] Запускаем скрипты Ruby из Go Lang
- [Программирование, Удалённая работа] Дружим WSL и VSCode через Tailscale и упрощаем работу в сети (перевод)
- [Программирование, Учебный процесс в IT, Карьера в IT-индустрии, Конференции] Бесплатные онлайн-мероприятия по разработке (1 марта — 7 марта 2021)
- [Программирование] Чем синьор отличается от джуна?
- [Тестирование IT-систем, Программирование, Java, MongoDB] Run MongoDB Atlas locally for testing
- [JavaScript] Неудачный опыт миграции Electron приложения на ECMAScript модули
- [Разработка веб-сайтов, Программирование, Dart, Flutter] Подготовка экосистем Dart и Flutter к переходу на null safety (перевод)
- [Анализ и проектирование систем, Микросервисы] Как управлять транзакциями в микросервисной архитектуре
- [JavaScript, ReactJS] Поиск данных в столбцах таблицы с пагинацией (front-часть)
- [Java] Как использовать шаблон Circuit Breaker в приложении Spring Boot (перевод)
Теги для поиска: #_programmirovanie (Программирование), #_java, #_kotlin, #_gradle, #_mikroservisy (Микросервисы), #_java, #_kotllin, #_docker, #_dockercompose, #_digitalocean, #_ktor, #_microservice, #_gradle, #_programmirovanie (
Программирование
), #_java, #_kotlin, #_gradle, #_mikroservisy (
Микросервисы
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 12:15
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Для разработчиков не секрет, что создание нового сервиса влечет за собой немало рутиной настройки: билд скрипты, зависимости, тесты, docker, k8s дескрипторы. Раз мы выполняем эту работу, значит текущих шаблонов IDE недосточно. Под катом мои попытки автоматизировать все до одной кроссплатформенной кнопки "сделать хорошо" сопровождаемые кодом, примерами и финальным результатом. Если перспективы создания сервисов в один клик с последующим автоматическим деплоем в Digital Ocean звучат заманчиво, значит эта статья для вас. Начнем создавать наш шаблон и прежде всего рассмотрим организацию сборки. Несмотря на любовь многих к maven за его простоту и декларативность, использовать будем gradle, ибо он современее и позволяет писать скрипт сборки на одном языке с проектом. Помимо самого Kotlin плагина, нам потребуется еще два: plugins {
kotlin("jvm") version "1.4.30" // Чтобы собрать fat jar id("com.github.johnrengelman.shadow") version "6.1.0" // Чтобы собрать self-executable приложение с jvm id("org.beryx.runtime") version "1.12.1" } assertThat("xyzzy", startsWith("x") and endsWith("y") and !containsSubstring("a"))
dependencies {
// для парсинга аргументов командой строки implementation("com.github.ajalt.clikt:clikt:3.1.0") implementation("io.ktor:ktor-server-netty:1.5.1") testImplementation("org.testng:testng:7.3.0") testImplementation("com.natpryce:hamkrest:1.8.0.1") testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0") } application { @Suppress("DEPRECATION") // for compatibility with shadowJar mainClassName = "AppKt" } tasks { test { useTestNG() } compileKotlin { kotlinOptions { jvmTarget = "15" } } } Из того что следует отметить, позволил себе небольшую вольность с официальным Kotlin codestyle чуть-чуть поправив его в .editorsconfig: [*.{kt, kts, java, xml, html, js}]
max_line_length = 120 indent_size = 2 continuation_indent_size = 2 Чтобы собрать self-executable jar используйте команду gradle clean test shadowJar
Осталось написать Dockerfile, его привожу целиком. Сборка и запуск разделены и производятся в два этапа: # syntax = docker/dockerfile:experimental
FROM gradle:jdk15 as builder WORKDIR /app COPY src ./src COPY build.gradle.kts ./build.gradle.kts RUN --mount=type=cache,target=./.gradle gradle clean test shadowJar FROM openjdk:15-alpine as backend WORKDIR /root COPY --from=builder /app/*.jar ./app Сконфигурируем запуск приложения при помощи Docker Compose: version: "3.9"
services: backend: build: . command: java -jar app $BACKEND_OPTIONS ports: - "80:80" docker-compose up
При последующих изменениях в master ветке репозитория, передеплой запустится автоматически. Очень удобно. И наконец, все описанное в статье, подробно задокументировано в README.md файле шаблона проекта, чтобы после создания последующая сборка и деплой не вызывали сложностей. Исползьовать описаный шаблон чтобы получить готовый репозиторий, можно просто нажав кнопочку "Use this template"на GitHub: github.com/demidko/Projekt Или, если вам нужен варинт с портабельным jvm: github.com/demidko/Projekt-portable После этого остается только написать логику :) Как и любой подход, этот шаблон не лишен недостатков, поэтому интересно услышать предложения, комментарии и критику. =========== Источник: habr.com =========== Похожие новости:
Программирование ), #_java, #_kotlin, #_gradle, #_mikroservisy ( Микросервисы ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 12:15
Часовой пояс: UTC + 5