伺服器引擎
要執行 Ktor 伺服器應用程式,您需要先 建立 並設定伺服器。 伺服器設定包含不同的設定:
- 一個用於處理網路請求的 引擎。
- 用於存取伺服器的主機和連接埠值。
- SSL 設定。
支援的平台
下表列出了每個引擎支援的平台:
| Engine | Platforms | HTTP/2 |
|---|---|---|
Netty | JVM | ✅ |
Jetty | JVM | ✅ |
Tomcat | JVM | ✅ |
CIO (Coroutine-based I/O) | JVM, Native, GraalVM, JavaScript, WasmJs | ✖️ |
ServletApplicationEngine | JVM | ✅ |
新增依賴項
在使用所需的引擎之前,您需要將對應的依賴項新增到您的 建置腳本 中:
ktor-server-nettyktor-server-jetty-jakartaktor-server-tomcat-jakartaktor-server-cio
以下是為 Netty 新增依賴項的範例:
選擇如何建立伺服器
Ktor 伺服器應用程式可以透過 兩種方式建立和執行:
- 使用
embeddedServer在程式碼中快速傳遞伺服器參數 - 使用
EngineMain從外部的 application.conf 或 application.yaml 檔案載入設定。
embeddedServer
embeddedServer() 函式接受一個引擎工廠,用於建立特定類型的引擎。在下面的範例中,我們傳遞 Netty 工廠以 Netty 引擎執行 伺服器並監聽 8080 連接埠:
import io.ktor.server.response.*
import io.ktor.server.routing.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
fun main(args: Array<String>) {
embeddedServer(Netty, port = 8080) {
routing {
get("/") {
call.respondText("Hello, world!")
}
}
}.start(wait = true)
}EngineMain
EngineMain 代表一個用於執行伺服器的引擎。您可以使用以下引擎:
io.ktor.server.netty.EngineMainio.ktor.server.jetty.jakarta.EngineMainio.ktor.server.tomcat.jakarta.EngineMainio.ktor.server.cio.EngineMain
建立並啟動伺服器
EngineMain.main() 函式用於以選定的引擎啟動伺服器,並載入 外部 設定檔 中指定的 應用程式模組。在 下面的範例中,應用程式的 main 函式啟動伺服器:
package com.example
import io.ktor.server.application.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
fun main(args: Array<String>): Unit = io.ktor.server.netty.EngineMain.main(args)
fun Application.module() {
routing {
get("/") {
call.respondText("Hello, world!")
}
}
}ktor {
deployment {
port = 8080
}
application {
modules = [ com.example.ApplicationKt.module ]
}
}ktor:
deployment:
port: 8080
application:
modules:
- com.example.ApplicationKt.module如果您需要使用建置系統任務啟動伺服器,您需要將所需的 EngineMain 設定為主類別:
application {
mainClass.set("io.ktor.server.netty.EngineMain")
}mainClassName = "io.ktor.server.netty.EngineMain"<properties>
<main.class>io.ktor.server.netty.EngineMain</main.class>
</properties>建立伺服器實例而不立即啟動它
除了直接呼叫 EngineMain.main() 以立即啟動伺服器之外,您也可以呼叫 EngineMain.createServer(),它會回傳一個 EmbeddedServer 實例,但不會立即啟動它。
這種方法讓您能夠控制何時呼叫 .start()、.stop(),或在伺服器開始接受請求之前對伺服器執行任何操作。
// Example using Netty
val server = io.ktor.server.netty.EngineMain.createServer(args)
// perform additional initialization, logging, instrumentation, etc.
server.start(wait = true)設定引擎
在本節中,我們將探討如何指定各種引擎特有的選項。
在程式碼中
embeddedServer 函式允許您使用 configure 參數傳遞引擎特有的選項。此參數包含所有引擎通用的選項,並由 ApplicationEngine.Configuration 類別公開。
下面的範例展示了如何使用 Netty 引擎設定伺服器。在 configure 區塊內,我們定義了一個 connector 來指定主機和連接埠,並 自訂各種伺服器參數:
connectors.add() 方法定義了一個包含指定主機 (127.0.0.1) 和連接埠 (8080) 的連接器。
除了這些選項之外,您還可以設定其他引擎特有的屬性。
Jetty
Jetty 特有的選項由 JettyApplicationEngineBase.Configuration 類別公開。
您可以在 configureServer 區塊內設定 Jetty 伺服器,該區塊提供了對 Server 實例的存取權限。
使用 idleTimeout 屬性指定連線在關閉前可以閒置的時間長度。
在設定檔中
如果您使用 EngineMain,您可以在 ktor.deployment 群組中指定所有引擎通用的選項。
