Всем привет! Сегодня я расскажу, как Android разработчику, можно создать свой собственный бекенд сервер на Ktor. На самом деле, ничего сложного в этом нет, если у вас есть опыт разработки под Android, то написать простой бекенд на Ktor не составит труда.
В этой статье не будет каких-то больших деталей, этого вполне достаточно на Youtube, Meduim, Habr и других сервисах, больше вводная информация по изучению Ktor.
- Первое что необходимо сделать, это ознакомиться с документацией, всё досканально прочитать и параллельно написать свой первый тестовый проект на Ktor.
- Далее, когда у вас уже будут базовые знания, можно приступать к реализации свое идеи. Да, так сразу, почему нет?
- Распишите подробно, какие endpoint’ы вы хотите реализовать?
- Спроектируйте БД для вашего сервера, какие таблицы и как они связаны?
- После этого можно приступать к написанию кода.
Ниже представлен небольшой список библиотек, с которыми вам скорее всего придётся столкнуться:
Netty Web Server и альтернативы
Ktor по умолчанию использует Netty как сервер для обработки HTTP-запросов. Netty — высокопроизводительный и асинхронный веб-сервер, который позволяет обрабатывать большое количество соединений с минимальными задержками. Однако, Ktor также поддерживает другие веб-серверы:
- Jetty : Другой популярный асинхронный веб-сервер для Java, который также можно использовать с Ktor.
- Tomcat : Сервер приложений, который поддерживает Java Servlet API.
- CIO (Coroutine-based I/O) : Собственный веб-сервер Ktor, который использует корутины для обработки запросов.
Для использования другого сервера в Ktor, нужно указать его в конфигурации приложения:
embeddedServer(Jetty, port = 8080) {
// настройка приложения
}.start(wait = true)
PostgreSQL и Ktor
PostgreSQL часто используется в Ktor для хранения данных приложения. Взаимодействие с базой данных PostgreSQL в Ktor осуществляется с помощью библиотеки Exposed или других ORM (например, Hibernate). Для установки и запуска PostgreSQL можно использовать Docker и Docker Compose.
Пример конфигурации Docker Compose для PostgreSQL:
version: '3'
services:
db:
image: postgres:13
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydatabase
ports:
- "5432:5432"
В Ktor можно использовать Exposed для взаимодействия с базой данных:
// подключение к базе данных
Database.connect("jdbc:postgresql://localhost:5432/mydatabase", driver = "org.postgresql.Driver", user = "user", password = "password")
transaction {
// работа с базой данных
}
HikariCP и Ktor
github.com/brettwooldridge/HikariCP
HikariCP — это пул соединений, который обеспечивает эффективное управление соединениями с базой данных. В Ktor HikariCP используется совместно с Exposed для улучшения производительности при работе с базой данных.
Пример конфигурации HikariCP с Ktor и Exposed:
val hikariConfig = HikariConfig().apply {
jdbcUrl = "jdbc:postgresql://localhost:5432/mydatabase"
driverClassName = "org.postgresql.Driver"
username = "user"
password = "password"
maximumPoolSize = 10
}
val dataSource = HikariDataSource(hikariConfig)
Database.connect(dataSource)
transaction {
// работа с базой данных
}
Bcrypt и Ktor
Bcrypt используется для безопасного хэширования паролей. В Ktor Bcrypt можно использовать для создания и проверки хэшированных паролей при аутентификации пользователей.
Пример использования Bcrypt в Ktor:
import org.mindrot.jbcrypt.BCrypt
fun hashPassword(password: String): String {
return BCrypt.hashpw(password, BCrypt.gensalt())
}
fun checkPassword(password: String, hashed: String): Boolean {
return BCrypt.checkpw(password, hashed)
}
// Пример маршрута для регистрации пользователя
post("/register") {
val password = call.receiveParameters()["password"]!!
val hashedPassword = hashPassword(password)
// сохранение hashedPassword в базе данных
}
Docker Compose и Ktor
Docker Compose упрощает развертывание приложений, состоящих из нескольких сервисов, таких как веб-сервер, база данных и другие компоненты. Используя Docker Compose, можно легко запускать и управлять всеми зависимостями Ktor-приложения в контейнерах.
Пример конфигурации Docker Compose для Ktor и PostgreSQL:
version: '3'
services:
web:
image: myktorapp:latest
ports:
- "8080:8080"
depends_on:
- db
environment:
DATABASE_URL: jdbc:postgresql://db:5432/mydatabase
DATABASE_USER: user
DATABASE_PASSWORD: password
db:
image: postgres:13
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydatabase
ports:
- "5432:5432"
Файл Docker Compose позволяет описать все необходимые сервисы и их зависимости, после чего можно запустить все сервисы одной командой:
docker-compose up
Это значительно упрощает процесс развертывания и управления инфраструктурой приложения.
Пример репозитория с использованием этих всех технологий, можно посмотреть тут: