博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
10、Ktor学习-运行程序和基础架构;
阅读量:7291 次
发布时间:2019-06-30

本文共 3413 字,大约阅读时间需要 11 分钟。

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

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

转载地址:http://txjjm.baihongyu.com/

你可能感兴趣的文章
mybatis调用oracle存储过程
查看>>
shell练习五
查看>>
踩坑Apache HttpEntity
查看>>
Core Data的使用(二)
查看>>
MYSQL外键(Foreign Key)的使用
查看>>
导入开源库到基于Android Studio构建的项目中
查看>>
Maven 在eclispe中集成本地插件报错解决方案
查看>>
Ubuntu中必装的十个应用程序
查看>>
Object-c 单例模式中的 allocWithZone作用
查看>>
分享一个H5原生form表单的checkbox特效
查看>>
nodejs+npm+webpack+vue+ElementUI+vue-route
查看>>
JAVA编程插入Excel文件到Word数据区域
查看>>
Highcharts 3.0.8功能特性使用评测
查看>>
大型分布式网站架构实战项目分析
查看>>
游戏开发--开源软件6--LimeJS(javascript)||Gamvas||gamejs
查看>>
Android四种常用的消息传递机制/模式的比较
查看>>
我的友情链接
查看>>
五虎遁月 和 五鼠遁时 法
查看>>
很好的一个blog,记录一下
查看>>
关于mysql修复表
查看>>