10、Ktor學習-執行程式和基礎架構;

Melrose發表於2019-03-08

在外部主機中執行應用程式

  當您需要在獨立維護的主機(例如Tomcat)中執行Ktor應用程式時,您需要一個application.conf檔案來告訴Ktor如何啟動您的應用程式。

定義配置

  在resources資料夾中,建立名為application.conf的檔案使用以下內容:

ktor {
    deployment {
        port = 8080
    }

    application {
        modules = [ my.company.MyApplication.ApplicationKt.main ]
    }
}
複製程式碼

從IDE內部執行應用程式

  使用開發引擎支援在諸如IntelliJ IDEA的開發環境中執行應用程式。

  1. 使用“Application”作為模板建立新的執行配置。

  2. 對於主類,請使用以下引擎之一:

    • Netty: 使用 io.ktor.server.netty.EngineMain
    • Jetty: 使用 io.ktor.server.jetty.EngineMain
  3. 指定要使用的模組。

  4. 通過為其命名來儲存配置。

  儲存配置後,您現在可以從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的單獨例項。 因此,當執行根路由節點時,它將執行自己的管道。 並且在處理完路線後將停止執行。

相關文章