在外部主機中執行應用程式
當您需要在獨立維護的主機(例如Tomcat)中執行Ktor應用程式時,您需要一個application.conf檔案來告訴Ktor如何啟動您的應用程式。
定義配置
在resources資料夾中,建立名為application.conf的檔案使用以下內容:
ktor {
deployment {
port = 8080
}
application {
modules = [ my.company.MyApplication.ApplicationKt.main ]
}
}
複製程式碼
從IDE內部執行應用程式
使用開發引擎支援在諸如IntelliJ IDEA的開發環境中執行應用程式。
-
使用“Application”作為模板建立新的執行配置。
-
對於主類,請使用以下引擎之一:
- Netty: 使用 io.ktor.server.netty.EngineMain
- Jetty: 使用 io.ktor.server.jetty.EngineMain
-
指定要使用的模組。
-
通過為其命名來儲存配置。
儲存配置後,您現在可以從IntelliJ/IDEA內部執行應用程式以進行開發/除錯,而無需部署到容器或設定任何應用程式伺服器。
使用自動重新載入
當檢測到對類檔案的更改時,即構建應用程式時,Ktor可以自動重新載入應用程式。通過向application.conf新增watch配置來啟用此功能:
ktor {
deployment {
port = 8080
watch = [ my.company ]
}
…
}
複製程式碼
基礎架構
切入點
您可以通過多種方式執行Ktor應用程式:
- 用一個普通的main來呼叫embeddedServer
- 執行EngineMain主函式並使用HOCON application.conf配置檔案
- 作為Web伺服器中的Servlet
啟動
公共部分
ApplicationEngineEnvironment:
首先,必須建立這種不可變的環境;使用classLoader,Logger,配置,充當應用程式事件的事件匯流排的監視器,以及將形成應用程式和watchPaths的一組聯結器和模組。
您可以使用ApplicationEngineEnvironmentBuilder構建它,並使用方便的DSL函式applicationEngineEnvironment,commandLineEnvironment等。
ApplicationEngine:
有多個ApplicationEngine,每個都支援對應的伺服器,如:Netty,Jetty,CIO或Tomcat。
ApplicationEngine是負責執行應用程式的類,它具有特定的配置,相關的環境,可以啟動和停止。
當您啟動特定的ApplicationEngine時,它將使用提供的配置來監聽,通過使用SSL,證書等與正確的埠和主機,以及指定的工作程式。
聯結器將用於偵聽特定的http/https主機和埠。 而Application管道將用於處理請求。
Application : Pipeline:
它由ApplicationEngineEnvironment建立,最初為空。它是一個沒有主題的Pipeline,它將ApplicationCall作為上下文。 在建立環境時,將呼叫每個指定的模組來配置此應用程式。
embeddedServer
當您執行自己的main方法並呼叫embeddedServer函式時,它將提供特定的ApplicationEngineFactory,然後建立或提供ApplicationEngineEnvironment。
EngineMain
Ktor為每個支援的伺服器引擎定義了一個EngineMain類。此類定義可以執行以執行應用程式的main方法。 通過使用commandLineEnvironment,它將從您的資源載入HOCON application.conf檔案,並將使用額外的引數來確定要安裝的模組以及如何配置伺服器。
這些類通常在CommandLine.kt檔案中宣告。
- CIO: io.ktor.server.cio.EngineMain.main
- Jetty: io.ktor.server.jetty.EngineMain.main
- Netty: io.ktor.server.netty.EngineMain.main
- Tomcat: io.ktor.server.tomcat.EngineMain.main
監控事件
與環境相關聯的是Ktor用於引發應用程式事件的監視器例項。 可以使用它來訂閱事件。 例如,您可以訂閱停止應用程式事件以關閉特定服務或完成某些資源。
val ApplicationStarting = EventDefinition<Application>()
val ApplicationStarted = EventDefinition<Application>()
val ApplicationStopPreparing = EventDefinition<ApplicationEnvironment>()
val ApplicationStopping = EventDefinition<Application>()
val ApplicationStopped = EventDefinition<Application>()
複製程式碼
管道(Pipelines)
Ktor定義了非同步可擴充套件計算的管道。 管道在Ktor各處使用。
所有管道都具有關聯的主題型別,上下文型別以及與其關聯的攔截器的階段列表。 以及充當小型物件容器的屬性。
階段是有序的,可以定義為在另一階段之後或之前,或在結束時執行。
每個管道都有一個該例項的相位上下文的有序列表,其中包含每個階段的一組攔截器。
ApplicationCallPipeline
Ktor的伺服器部分定義了一個沒有主題的ApplicationCallPipeline管道,並將ApplicationCall定義為上下文。 Application例項是ApplicationCallPipeline。
因此,當伺服器的應用程式引擎處理HTTP請求時,它將執行Application管道。
上下文類ApplicationCall包含應用程式,請求,響應以及屬性和引數。
最後,應用程式模組將結束為應用程式管道的特定階段註冊攔截器,以處理請求併發出響應。
val Setup = PipelinePhase("Setup") //用於準備Call和處理屬性的階段
val Monitoring = PipelinePhase("Monitoring") // 跟蹤呼叫的階段:日誌記錄,指標,錯誤處理等。
val Features = PipelinePhase("Features") // 基礎設施功能的階段,在此階段的大多數攔截
val Call = PipelinePhase("Call") // 用於處理Call和傳送響應的階段
val Fallback = PipelinePhase("Fallback") // 處理未處理Call的階段
複製程式碼
Features(功能)
Ktor使用ApplicationFeature類定義應用程式功能。 您可以將功能安裝到特定管道。 它可以訪問管道,它可以註冊攔截器並執行各種其他操作。
路由
為了說明功能和管道樹如何協同工作,與其他功能一樣,路由通常安裝如下:
install(Routing) { }
複製程式碼
但是有一種簡單的方法可以註冊並開始使用它,如果它已經註冊,它也會安裝它:
routing { }
複製程式碼
路由被定義為樹,其中每個節點都是Route,它也是ApplicationCallPipeline的單獨例項。 因此,當執行根路由節點時,它將執行自己的管道。 並且在處理完路線後將停止執行。