Ktor — это асинхронный фреймворк для создания веб-приложений на языке Kotlin от компании JetBrains. Он легковесен, модулен и построен с учетом корутин Kotlin, что делает его отличным выбором для микросервисов и API. Освоить основы Ktor можно очень быстро. Эта инструкция проведет вас через лучшие практики создания надежного серверного приложения, от инициализации проекта до деплоя, укладываясь в 30 минут активной работы.
Шаг 1: Быстрый старт проекта. Убедитесь, что у вас установлена JDK (версии 8 или выше) и IntelliJ IDEA (Community Edition достаточно). Самый простой способ создать проект — использовать генератор на сайте start.ktor.io. Выберите последнюю стабильную версию Ktor. В качестве движка (engine) выберите `Netty` для standalone-сервера — это стандартный и производительный выбор. Добавьте необходимые плагины (Features): для начала обязательно `Routing`, `Content Negotiation` и `Logging`. `Routing` — это ядро для определения endpoints. `Content Negotiation` с плагином `kotlinx.serialization` или `gson` позволит автоматически сериализовать/десериализовать JSON. `Logging` поможет в отладке. Нажмите "Generate Project" и скачайте архив.
Шаг 2: Откройте проект в IntelliJ IDEA. Импортируйте его как Maven или Gradle проект (в сгенерированном проекте есть оба варианта). Дождитесь индексации и загрузки зависимостей. Изучите структуру: ключевой файл — `Application.kt` в `src/main/kotlin`. В нем находится функция `main` и конфигурация модулей с помощью `embeddedServer`. Функция `Application.module()` — это точка входа для настройки вашего приложения.
Шаг 3: Определение чистых маршрутов (Routing). Внутри `Application.module()` после `install(Routing) { ... }` или в отдельном файле определите свои endpoints. Лучшая практика — разделять маршруты по функциональности. Не пишите всю логику внутри блока маршрутизации. Вместо этого выносите обработчики в отдельные контроллеры или функции.
```
routing {
route("/api/v1") {
route("/users") {
get { call.respondText("Get users list") }
post { call.respondText("Create a user") }
get("/{id}") {
val id = call.parameters["id"]
call.respondText("Get user with id: $id")
}
}
}
}
```
Шаг 4: Работа с данными (JSON). Убедитесь, что плагин `ContentNegotiation` установлен и сконфигурирован. В `Application.module()` добавьте:
```
install(ContentNegotiation) {
json() // использует kotlinx.serialization. Для GSON: gson()
}
```
Создайте data class для вашей модели:
```
@Serializable
data class User(val id: Int, val name: String, val email: String)
```
Теперь вы можете легко возвращать и принимать JSON:
```
post {
val user = call.receive()
call.respond(HttpStatusCode.Created, user.copy(id = newId))
}
```
Шаг 5: Структурирование проекта и внедрение зависимостей (DI). Для небольших проектов можно обойтись без тяжелых фреймворков DI. Используйте pattern "сервисного слоя". Создайте папку `service` и интерфейс с реализацией, например, `UserService`. В `Application.module()` создайте экземпляр сервиса и передавайте его в обработчики маршрутов (через расширения Call или в конструктор контроллера, если вы их выделили). Для более сложных случаев рассмотрите Koin или простой manual DI.
Шаг 6: Обработка ошибок и статусы HTTP. Всегда отвечайте соответствующими HTTP-статусами. Используйте `call.respond(HttpStatusCode.NotFound)` вместо просто текста. Для централизованной обработки исключений используйте перехват статусов или установите плагин `StatusPages`:
```
install(StatusPages) {
exception { cause ->
call.respond(HttpStatusCode.Unauthorized, mapOf("error" to cause.message))
}
exception { cause ->
call.respond(HttpStatusCode.NotFound, mapOf("error" to "Resource not found"))
}
}
```
Шаг 7: Аутентификация и авторизация. Установите плагин `Authentication`. Настройте его в `Application.module()`. Ktor поддерживает базовую, JWT, сессионную и OAuth аутентификацию. Пример для JWT:
```
install(Authentication) {
jwt {
verifier(JwtConfig.verifier)
validate { credential ->
if (credential.payload.getClaim("username").asString() != "") {
JWTPrincipal(credential.payload)
} else null
}
}
}
```
Защитите маршруты с помощью `authenticate`:
```
route("/protected") {
authenticate {
get { call.respond(call.principal()?.payload?.subject ?: "Unknown") }
}
}
```
Шаг 8: Логирование и мониторинг. Плагин `CallLogging` уже установлен. Настройте его уровень:
```
install(CallLogging) {
level = Level.INFO
filter { call -> call.request.path().startsWith("/api") }
}
```
Для метрик рассмотрите плагин `Metrics`, который может интегрироваться с Micrometer.
Шаг 9: Тестирование. Ktor предоставляет `TestApplicationEngine` для модульного и интеграционного тестирования. Создайте тест, который запускает ваше приложение in-memory и отправляет HTTP-запросы к endpoints. Это гарантирует, что ваши маршруты и логика работают корректно.
Шаг 10: Конфигурация и деплой. Выносите конфигурационные параметры (порт, URL БД, секреты) в файл `application.conf` в формате HOCON. Для деплоя создайте fat JAR с помощью плагина Shadow Jar для Gradle или просто используйте задачу `assemble`. Запуск в production: `java -jar your-application.jar`. Для контейнеризации создайте простой `Dockerfile` на основе openjdk.
Следуя этим шагам и практикам, вы за 30 минут заложите фундамент для чистого, поддерживаемого и масштабируемого серверного приложения на Ktor. Фреймворк дает свободу и не навязывает структуру, поэтому дисциплина в организации кода с самого начала — ваш ключ к успеху.
Лучшие практики Ktor: Пошаговая инструкция по созданию эффективного сервера за 30 минут
Практическое пошаговое руководство по созданию серверного приложения на фреймворке Ktor за 30 минут. Рассматриваются лучшие практики маршрутизации, работы с JSON, структурирования кода, обработки ошибок, аутентификации, логирования, тестирования и деплоя.
210
4
Комментарии (20)