伺服器引擎
要執行 Ktor 伺服器應用程式,您需要先建立並配置伺服器。 伺服器配置包含不同的設定:
- 處理網路請求的引擎。
- 用於存取伺服器的裝機和連接埠值。
- SSL 設定。
支援的平台
下表列出了每個引擎支援的平台:
| 引擎 | 平台 | HTTP/2 |
|---|---|---|
Netty | JVM | ✅ |
Jetty | JVM | ✅ |
Tomcat | JVM | ✅ |
CIO (基於協同程式的 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(),或在伺服器開始接受請求之前執行任何操作。
// 使用 Netty 的範例
val server = io.ktor.server.netty.EngineMain.createServer(args)
// 執行額外的初始化、記錄、檢測等。
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 群組中指定所有引擎通用的選項。
