shalkoff.ru
558 слова
3 минуты
Создание собственного бекенд сервера на Ktor

Всем привет! Сегодня я расскажу, как Android разработчику, можно создать свой собственный бекенд сервер на Ktor. На самом деле, ничего сложного в этом нет, если у вас есть опыт разработки под Android, то написать простой бекенд на Ktor не составит труда.

В этой статье не будет каких-то больших деталей, этого вполне достаточно на Youtube, Meduim, Habr и других сервисах, больше вводная информация по изучению Ktor.

  1. Первое что необходимо сделать, это ознакомиться с документацией, всё досканально прочитать и параллельно написать свой первый тестовый проект на Ktor.
  2. Далее, когда у вас уже будут базовые знания, можно приступать к реализации свое идеи. Да, так сразу, почему нет?
  3. Распишите подробно, какие endpoint’ы вы хотите реализовать?
  4. Спроектируйте БД для вашего сервера, какие таблицы и как они связаны?
  5. После этого можно приступать к написанию кода.

Ниже представлен небольшой список библиотек, с которыми вам скорее всего придётся столкнуться:

Netty Web Server и альтернативы#

netty.io

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.org

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#

github.com/jeremyh/jBCrypt

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#

docs.docker.com/compose/

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

Это значительно упрощает процесс развертывания и управления инфраструктурой приложения.

Пример репозитория с использованием этих всех технологий, можно посмотреть тут:

shalkov
/
KtorServer_ScheduleBus
Waiting for api.github.com...
00K
0K
0K
Waiting...