Skip to content

伺服器引擎

要執行 Ktor 伺服器應用程式,您需要先建立並配置伺服器。 伺服器配置包含不同的設定:

  • 處理網路請求的引擎
  • 用於存取伺服器的裝機和連接埠值。
  • SSL 設定。

支援的平台

下表列出了每個引擎支援的平台:

引擎平台HTTP/2
NettyJVM
JettyJVM
TomcatJVM
CIO (基於協同程式的 I/O)JVM, Native, GraalVM, JavaScript, WasmJs✖️
ServletApplicationEngineJVM

新增相依性

在開始使用所需的引擎之前,您需要將對應的相依性新增至您的建置指令碼

  • ktor-server-netty
  • ktor-server-jetty-jakarta
  • ktor-server-tomcat-jakarta
  • ktor-server-cio

以下是為 Netty 新增相依性的範例:

Kotlin
Groovy
XML

選擇建立伺服器的方式

Ktor 伺服器應用程式可以透過兩種方式建立並執行

  • 使用 embeddedServer 在程式碼中快速傳遞伺服器參數
  • 使用 EngineMain 從外部的 application.confapplication.yaml 檔案載入配置。

embeddedServer

embeddedServer() 函式接受一個引擎工廠,用於建立特定類型的引擎。在下面的範例中,我們傳遞了 Netty 工廠來執行具有 Netty 引擎的伺服器,並監聽 8080 連接埠:

kotlin
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.EngineMain
  • io.ktor.server.jetty.jakarta.EngineMain
  • io.ktor.server.tomcat.jakarta.EngineMain
  • io.ktor.server.cio.EngineMain

建立並啟動伺服器

EngineMain.main() 函式用於啟動具有所選引擎的伺服器,並載入外部設定檔中指定的應用程式模組。在下面的範例中,應用程式的 main 函式啟動了一台伺服器:

kotlin
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!")
        }
    }
}
shell
ktor {
    deployment {
        port = 8080
    }
    application {
        modules = [ com.example.ApplicationKt.module ]
    }
}
yaml
ktor:
    deployment:
        port: 8080
    application:
        modules:
            - com.example.ApplicationKt.module

如果您需要使用建置系統任務來啟動伺服器,您需要將必要的 EngineMain 配置為主類別:

kotlin
application {
    mainClass.set("io.ktor.server.netty.EngineMain")
}
groovy
mainClassName = "io.ktor.server.netty.EngineMain"
xml
<properties>
    <main.class>io.ktor.server.netty.EngineMain</main.class>
</properties>

建立伺服器執行個體而不啟動它

除了直接呼叫 EngineMain.main() 立即啟動伺服器外,您也可以呼叫 EngineMain.createServer(),它會傳回一個 EmbeddedServer 執行個體而不啟動它。

這種方法讓您可以控制何時呼叫 .start().stop(),或在伺服器開始接受請求之前執行任何操作。

Kotlin
// 使用 Netty 的範例
val server = io.ktor.server.netty.EngineMain.createServer(args)
// 執行額外的初始化、記錄、檢測等。
server.start(wait = true)

配置引擎

在本節中,我們將了解如何指定各種引擎特定的選項。

在程式碼中

embeddedServer 函式允許您使用 configure 參數傳遞引擎特定的選項。此參數包含所有引擎通用的選項,並由 ApplicationEngine.Configuration 類別公開。

下面的範例顯示如何使用 Netty 引擎配置伺服器。在 configure 區塊中,我們定義了一個 connector 來指定主機和連接埠,並自訂各種伺服器參數:

kotlin

connectors.add() 方法定義了一個具有指定主機 (127.0.0.1) 和連接埠 (8080) 的連接器。

除了這些選項之外,您還可以配置其他引擎特定的屬性。

Netty

Netty 特定的選項由 NettyApplicationEngine.Configuration 類別公開。

kotlin

Jetty

Jetty 特定的選項由 JettyApplicationEngineBase.Configuration 類別公開。

您可以在 configureServer 區塊中配置 Jetty 伺服器,該區塊提供對 Server 執行個體的存取。

使用 idleTimeout 屬性指定連接在關閉前可以閒置的時間長度。

kotlin

CIO

CIO 特定的選項由 CIOApplicationEngine.Configuration 類別公開。

kotlin

Tomcat

如果您使用 Tomcat 作為引擎,可以使用 configureTomcat 屬性進行配置,該屬性提供對 Tomcat 執行個體的存取。

kotlin

在設定檔中

如果您使用 EngineMain,可以在 ktor.deployment 群組中指定所有引擎通用的選項。

shell
yaml

Netty

您也可以在設定檔的 ktor.deployment 群組中配置 Netty 特定的選項:

shell
yaml