10、Ktor学习-运行程序和基础架构;

本文详细介绍在不同环境下运行Ktor应用的方法,包括使用application.conf配置文件、从IDE内部运行及利用自动重新加载功能。同时深入解析Ktor的基础架构,如ApplicationEngineEnvironment、ApplicationEngine、ApplicationCallPipeline和Features。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在外部主机中运行应用程序

  当您需要在独立维护的主机(例如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的单独实例。 因此,当执行根路由节点时,它将执行自己的管道。 并且在处理完路线后将停止执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值