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) }Сравнение с альтернативами
| Фреймворк | Стиль | Рефлексия | Вес | Асинхронность |
|---|---|---|---|---|
| Ktor | DSL + корутины | Нет | Лёгкий | Корутины |
| Spring Boot | Аннотации + AOP | Да | Тяжёлый | Thread pool |
| Vert.x | Callbacks / 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 с сериализатором. - Отправка JSON —
call.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.
Опубликовано:


