Ktor 3.2.0 już jest! Jest to drugie mniejsze wydanie w tym roku, przynoszące ekscytujące nowe funkcje, ulepszenia wydajności i poprawki błędów. To wydanie zawiera dwa nowe moduły do wstrzykiwania zależności i HTMX, obsługę katalogów wersji Gradle, automatyczną deserializację konfiguracji, obsługę gniazd domenowych Unix dla CIO i wiele więcej.
Typowana konfiguracja
Ktor teraz automatycznie deserializuje pliki konfiguracyjne do klas danych, oprócz typów prymitywnych.
Oto prosty plik application.yaml, który definiuje pewną konfigurację bazy danych.
database: jdbcUrl: "$DB_JDBC_URL:jdbc:postgresql://localhost/ktor_database" username: "$DB_USERNAME:ktor_user" password: "$DB_PASSWORD:ktor_password"
Uwaga: W Ktor, YAML może odwoływać się do zmiennych środowiskowych za pomocą składni $ENV_VAR lub „$ENV_VAR:default_value”, a nawet ${ENV_VAR} jak w HOCON.
Aby deserializować dane strukturalne, musimy je najpierw zdefiniować – definiujemy więc klasę danych, która pasuje do naszego pliku application.yaml. Gdy już ją zdefiniujemy, możemy użyć jej do załadowania naszej konfiguracji w sposób typowany w naszych modułach.
@Serializable data class DatabaseConfig( val jdbcUrl: String, val username: String, val password: String, ) fun Application.module() { property("database") }
Wstrzykiwanie zależności
Wydanie 3.2.0 zawiera zupełnie nowy moduł! Wstrzykiwanie zależności (DI) jest kluczową funkcją dla wielu zespołów i było bardzo pożądane przez społeczność. Moduł ten jest całkowicie opcjonalny, ale po włączeniu pozwala Ktor oferować dodatkową funkcjonalność dla użytkowników. Ktor DI jest zbudowany na coroutines, podobnie jak sam Ktor, co jest naprawdę potężne, ponieważ z łatwością pozwala na współbieżną inicjalizację aplikacji.
Automatycznie zamyka instancje AutoCloseable lub pozwala skonfigurować własne programy obsługi czyszczenia. Gdy serwer otrzyma polecenie stop, HikariDataSource zamknie się automatycznie, a następnie zostanie wykonany niestandardowy program obsługi bazy danych.
fun Application.database(@Property("database") config: DatabaseConfig) { dependencies { provide("optional-name") { HikariDataSource(...) } provide { Database.connect(resolve("optional-name")) } cleanup { database: Database -> TransactionManager.closeAndUnregister(database) } } }
Ktor DI pozwala również na łatwą integrację z istniejącymi frameworkami DI, a Koin 4.1 ma eksperymentalny moduł, który już integruje się z Ktor 3.2.0-EAP, oferując płynną interoperacyjność między Ktor DI i Koin. Więcej szczegółów można znaleźć na stronie internetowej Koin.
Zawieszanie modułów
Wraz z tymi nowymi funkcjami, Ktor obsługuje teraz również moduły zawieszone lub asynchroniczne. Umożliwiają one oczekiwanie na zależności, które wymagają zawieszenia w celu ich inicjalizacji. Ułatwiają one również zrównoleglanie dużych, złożonych grafów zależności.
suspend fun Application.module() { val database: Database = dependencies.resolve() ... }
Obsługa gniazda domeny Unix dla CIO
Silnik klienta i serwera CIO obsługuje teraz gniazda domeny Unix! Obsługa ta zapewnia bardziej wydajną dwukierunkową komunikację między procesami w tym samym systemie, pozwalając im całkowicie wyeliminować narzut sieciowy.
Aby korzystać z gniazd domeny Unix, należy jawnie skonfigurować embeddedServer do korzystania z unixConnector, określając ścieżkę do gniazda.
val server = embeddedServer(CIO, configure = { unixConnector("/tmp/test-unix-socket-client.sock") }) { routing { get("/") { call.respondText("Hello, Unix socket world!") } } }
Aby komunikować się z serwerem Ktor nasłuchującym na gniazdach domeny Unix, należy również połączyć się z tym samym plikiem gniazd domeny Unix.
val response = HttpClient(CIO) { defaultRequest { unixSocket("/tmp/test-unix-socket-client.sock") } }.get("/")
HTMX
Nowy moduł HTMX zawiera ścisłą integrację z kotlinx.html i Ktor Routing DSL. Pozwala to na łatwiejsze definiowanie atrybutów HTML dla HTMX i definiowanie tras, które automatycznie zawierają nagłówki HTMX.
fun Application.routing() { hx.get("/status") { /* Return HTML content */ } get("/status") { call.respondHtml { head { script { src = "https://unpkg.com/htmx.org@1.9.12" } } body { div { attributes.hx { get = "/status" trigger = "load" } } } } } }
Katalog wersji Ktor
Katalogi wersji szybko stały się standardem zarządzania zależnościami i ich wersjami w Gradle. Pozwalają nam na odwoływanie się do zależności w bezpieczny dla typu sposób z naszych skryptów Gradle i zarządzanie zależnościami w jednym miejscu. Ktor eksportuje teraz katalog wersji, podobnie jak Maven BOM. Aby użyć katalogu wersji Ktor, należy zaimportować go do pliku settings.gradle.kts:
dependencyResolutionManagement { versionCatalogs { create("ktorLibs") { from("io.ktor:ktor-version-catalog:3.2.0") } } repositories { mavenCentral() } }
Po zaimportowaniu można odwoływać się do wszystkich modułów Ktor w sposób bezpieczny dla typów ze wszystkich konfiguracji build.gradle.kts.
dependencies { implementation(ktorLibs.server.netty) implementation(ktorLibs.server.contentNegotiation) implementation(ktorLibs.serialization.kotlinx.json) }
Regresja Androida R8
W wydaniu Ktor 3.2.0 występuje znana regresja dotycząca systemu Android R8. Więcej informacji na ten temat można znaleźć w tym temacie na YouTrack. Zostanie on naprawiony w wydaniu 3.2.1. Pracujemy również nad ulepszeniem naszych systemów i zestawów testów, aby zapobiec regresji w tym obszarze w przyszłości.