在外部主机中运行应用程序
当您需要在独立维护的主机(例如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()val ApplicationStarted = EventDefinition ()val ApplicationStopPreparing = EventDefinition ()val ApplicationStopping = EventDefinition ()val ApplicationStopped = EventDefinition ()复制代码
管道(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的单独实例。 因此,当执行根路由节点时,它将执行自己的管道。 并且在处理完路线后将停止执行。