Ktor: Асинхронные приложения на Kotlin

Ktor 3.4.1: асинхронный фреймворк на Kotlin и корутинах. Архитектура Pipeline, Routing DSL, плагины, Ktor Client, тестирование, деплой. Лёгкий выбор для микросервисов и HTTP-клиентов. Без магии Spring.

Ktor — это асинхронный фреймворк для создания клиент-серверных приложений, разработанный JetBrains. Он полностью построен на корутинах (coroutines) и нацелен на лёгкость, гибкость и производительность. В отличие от тяжёлых монолитных решений, Ktor предлагает модульную архитектуру, где вы подключаете только то, что реально нужно.

Тезис 1. Ktor — асинхронный фреймворк от JetBrains, полностью на Kotlin и корутинах.

Тезис 2. Не содержит Spring-магии и рефлексии — минималистичный и прозрачный.

Актуальная стабильная версия на апрель 2026 — 3.4.1. Она включает поддержку Kotlin 2.1.20, улучшенную работу с HTTP/2, WebSockets и новую экспериментальную фичу — графовые маршруты (Graph Routing).

Архитектура Ktor: Pipeline и Plugins

Основа Ktor — конвейер (Pipeline). Каждый запрос проходит через цепочку перехватчиков (interceptors), которые могут модифицировать запрос, ответ или прервать обработку. Это напоминает middleware в Express.js или OkHttp.

Plugins (ранее назывались Features) — это готовые реализации таких перехватчиков. Вы устанавливаете плагин и настраиваете его в блоке install. В версии 3.4.1 все плагины стали строго типобезопасными.

Тезис 3. Работает как сервер (Netty, CIO, Jetty, Tomcat) и как HTTP-клиент.

Тезис 4. Всё строится на Pipeline — последовательности перехватчиков (interceptors).

Тезис 5. Функциональность подключается через плагины (бывшие features).

Пример подключения плагинов:

fun Application.module() { install(ContentNegotiation) { json() } install(CORS) install(Routing) }

Сравнение с альтернативами

ФреймворкСтильРефлексияВесАсинхронность
KtorDSL + корутиныНетЛёгкийКорутины
Spring BootАннотации + AOPДаТяжёлыйThread pool
Vert.xCallbacks / RxНетЛёгкийVerticles
http4kФункциональныйНетЛёгкийKotlin Coroutines

Ktor выигрывает в простоте и родной интеграции с экосистемой Kotlin.

Настройка проекта

Самый быстрый способ — Ktor Project Generator (start.ktor.io). Выбираете движок (Netty — самый популярный), плагины и получаете готовый build.gradle.kts.

Базовые зависимости для версии 3.4.1:

implementation("io.ktor:ktor-server-netty:3.4.1") implementation("io.ktor:ktor-server-content-negotiation:3.4.1") implementation("io.ktor:ktor-serialization-kotlinx-json:3.4.1") implementation("io.ktor:ktor-server-routing:3.4.1")

Точка входа — функция main, запускающая встроенный движок:

fun main() = embeddedServer(Netty, port = 8080, module = Application::module).start(wait = true)

Серверное приложение: основы

Ktor поддерживает несколько движков: Netty (по умолчанию), CIO (чистый Kotlin), Jetty, Tomcat. Для production чаще выбирают Netty. Конфигурация происходит через лямбду application {... } или вынос в application.conf (HOCON).

Тезис 6.Routing — декларативный DSL для эндпоинтов, поддержка вложенных групп.

routing { get("/") { call.respondText("Hello, Ktor 3.4.1!") } }

Маршрутизация (Routing)

Routing DSL — это сердце серверного Ktor. Поддерживает:

  • Вложенные маршруты (route("/api") { route("/v1") {... } })
  • Параметры пути (get("/user/{id}"))
  • Параметры запроса (call.request.queryParameters["name"])
  • Все методы HTTP (GET, POST, PUT, DELETE, PATCH, HEAD)

Пример с группой и параметром:

route("/api") { get("/echo/{text}") { val text = call.parameters["text"] call.respondText("You said: $text") } }

Встроенные плагины

Плагины решают 90% типовых задач. Основные из них:

  • ContentNegotiation + kotlinx.serialization — автоматическая конвертация JSON.
  • CORS — настройка кросс-доменных запросов.
  • Authentication — JWT, Session, Basic, Form, OAuth.
  • StatusPages — перехват исключений и кастомные страницы ошибок.
  • Compression — gzip, deflate.
  • CallLogging — логирование запросов.
  • Sessions — серверные сессии (in-memory, Redis, DB).

Тезис 7.Content Negotiation — автоматическая сериализация JSON (kotlinx.serialization, Gson, Jackson).

Тезис 8.Аутентификация — готовые провайдеры: Basic, Form, JWT, Session, OAuth.

install(Authentication) { jwt { verifier(jwtVerifier) validate { credential -> JWTPrincipal(credential.payload) } } } authenticate("jwt") { get("/secure") { call.respondText("Только для авторизованных") } }

Работа с запросами и ответами

Основной объект — ApplicationCall. Он даёт доступ к request и response.

  • Чтение телаcall.receive<T>(), где T — data class с сериализатором.
  • Отправка JSONcall.respond(data).
  • Работа с заголовкамиcall.request.headers["User-Agent"].
  • Файлы и потокиcall.receiveChannel() / call.respondOutputStream {... }.

Пример с JSON:

data class User(val name: String, val age: Int) post("/user") { val user = call.receive<User>() call.respond(mapOf("status" to "created", "name" to user.name)) }

Ktor Client

Ktor Client — это HTTP-клиент с точно такой же философией: Pipeline, плагины, корутины. Поддерживает те же движки (CIO, OkHttp, Apache, JavaScript, Darwin для iOS).

Тезис 9.Ktor Client — единый интерфейс для HTTP-вызовов, поддерживает моки и тестирование.

val client = HttpClient(CIO) { install(ContentNegotiation) { json() } } val response: HttpResponse = client.get("https://api.example.com/users") val users: List<User> = client.get("https://api.example.com/users")

Клиент переиспользует плагины (Logging, Auth, WebSockets) и умеет загружать файлы через submitFormWithBinaryData.

Тестирование

Ktor предоставляет встроенный test-движок, который не открывает реальный порт, а напрямую прогоняет запросы через конвейер. Отлично интегрируется с JUnit 5.

Тезис 10.Тесты — встроенный движок без реального порта, интеграция с JUnit.

@Test fun testGetRoot() = testApplication { application { module() } client.get("/").apply { assertEquals(HttpStatusCode.OK, status) assertEquals("Hello, Ktor 3.4.1!", bodyAsText()) } }

Также можно тестировать Ktor Client через MockEngine — подменять реальные ответы моками.

Деплой и production

Ktor-приложение — это обычная JVM-программа. Способы деплоя:

  • Fat JAR — через Gradle Shadow или Ktor's own ktor-server-netty + ktor-server-netty-jtopen.
  • Docker — минимальный образ eclipse-temurin:21-jre-alpine.
  • Reverse Proxy — Nginx / Apache, настройка проксирования на порт приложения.
  • Cloud — AWS Lambda (через адаптер), Heroku, Google Cloud Run.

Для production отключают ненужные плагины, включают сжатие, настраивают пул соединений и выставляют логирование на уровень WARN.

Тезис 11.Микросервисы — идеален за счёт лёгкости (малый memory footprint) и быстрого старта.

Пример Dockerfile:

FROM eclipse-temurin:21-jre-alpine COPY build/libs/app-all.jar /app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]

Заключение: когда выбирать Ktor

Ktor идеально подходит для:

  • Микросервисов и REST API-шлюзов
  • Реактивных приложений с WebSockets / Server-Sent Events
  • HTTP-клиентов на Kotlin (в том числе для Android, iOS через KMM)
  • Быстрых прототипов и небольших сервисов

Ограничения:

  • Нет готового ORM / интеграции с JPA (придётся ставить Exposed, Hibernate отдельно)
  • Меньше готовых интеграций, чем в Spring Boot (Kafka, S3 — через плагины, но не «из коробки»)
  • Кривая обучения: нужно понимать корутины и конвейеры

Тезис 12.Не подходит для монолитов с сотнями эндпоинтов, где нужны Spring Data/Hibernate и глубокое автоконфигурирование.

Итог: Ktor — это современный, лёгкий и очень котлиновый способ писать серверы и клиенты. А версия 3.4.1 делает его ещё стабильнее и быстрее.


Актуальная версия на апрель 2026: Ktor 3.4.1, Kotlin 2.1.20.

Опубликовано: