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

  当您需要在独立维护的主机(例如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 = 8080watch = [ 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、Ktor学习-运行程序和基础架构;相关推荐

  1. SolarWinds 升级 APM Suite,简化应用程序和基础架构管理!

    2020 年 6 月 12 日 – IT管理软件供应商SolarWinds (NYSE:SWI) 宣布,其旗下的 IT网络安全解决方案组合产品SolarWinds® APM Suite将带来新增和改进 ...

  2. 飞鸽传书程序IT基础架构和应用的管理

    同第一家公司相比,虽然新换的公司在薪酬方面没有质的提升,但是至少公司规模大了很多,在一个超过1000人的企业里工作,至少你能学习到规范化的制度流程,标准化的IT管理.而且企业的人数上去了之后,IT基础 ...

  3. OceanBase 从0到1数据库内核实战教程学习笔记 - 3.OceanBase基础架构和开发技巧

    这篇文章主要介绍王泽林老师分享的 <OceanBase 的基础架构和开发技巧>.如果您看过第一篇文章的对应视频,会发现整个系列主要分为 MiniOB 和 OceanBase 两个系列,本篇 ...

  4. Android 10 Camera学习笔记:Camera Framework架构

    CameraFramework架构 又是很久没有写了,这几天一直在看camera framework相关源码,于是乎整理出了这个架构图.Camera API2比较好整理,反而是Camera API1花 ...

  5. MySQL学习笔记一之基础架构

    MySQL学习笔记一之架构@TOC 架构图如下 Server层 连接器 负责跟客户端建立连接.获取权限.维持和管理连接 客户端如果太长时间没有动静,连接器会将其自动断开,时间由参数wait_timeo ...

  6. 学习记录-程序语言基础(1)

    1.汇编程序的功能是将用汇编语言编写的源程序翻译成机器指令程序.他一般至少需要两次扫描源程序才能完成翻译过程. 2.编译程序也称编译器,功能是把用高级语言书写的源程序翻译成与之等价的目标程序.编译过程 ...

  7. MySQL运行原理与基础架构

    下面是关于上述部件的介绍: connectors 与其他编程语言中的sql 语句进行交互,如php.java等. Management Serveices & Utilities 系统管理和控 ...

  8. 【数据架构】Netflix 万亿级实时数据基础架构的四个创新阶段

    我叫徐振中.我于 2015 年加入 Netflix,担任实时数据基础架构团队的创始工程师,后来领导了流处理引擎团队.我在 2010 年代初对实时数据产生了兴趣,从那时起我就相信还有很多价值有待发掘. ...

  9. MySQL的基础架构以及一条查询sql语句的执行流程

    详细介绍了Mysql的基础架构以及一条查询sql的执行流程. 如果不想作为一个只能简单的写写sql工程师,而是想要深入的学习MySQL,那么我们有必要首先从宏观的角度来了解MySQL的整体架构,只有把 ...

最新文章

  1. 为创业者保驾护航 “无安全 不创业” 安全狗全国路演北京站
  2. DIP第十章习题解答
  3. 轻量级3d模型查看器_耐能取得两项软件著作权,自研轻量级3D人脸识别算法领先业界...
  4. 【java】用javaSE来实现对mysql数据库的增删改查
  5. linux100day(day7)--用户管理和权限管理简单介绍
  6. 实战爬虫-爬取红袖添香并存入数据库
  7. Maven(4)--- 构建生命周期
  8. PHP中面向对象分析设计的经验总结
  9. SEGGER RTT使用总结
  10. matlab-基础 取整函数 向0取整 取最近整数 向上取整 向下取整
  11. 博途运行软件仿真步骤
  12. 浅谈Spring @Order注解的使用
  13. centos7环境下编译bitcoin
  14. Python 爬取手机 豆果美食app存Mongodb
  15. 篮球记分牌c语言程序和报告,基于单片机的篮球比赛电子记分牌最终版(备份存档)...
  16. 如何定位前后端Bug
  17. 电磁场与仿真软件(28)
  18. couldnotfindartifactcom.orcale:ojdbc6:pom:11.2.0.1.0innexus-aliyun
  19. java读取Excel指定格式的数据
  20. Java学习手册:Java是否支持多继承?为什么?

热门文章

  1. Struts和Spring使用的模板初探
  2. (剑指Offer)面试题61:按之字形顺序打印二叉树
  3. linux学习之yum命令的使用
  4. JS:1.2,控制语句(if,if else,for,switch,while,do while)
  5. 网络工程师应掌握的50个路由器知识要点
  6. linux中文件记录的时间参数,【Linux】stat命令查看文件的三个时间参数
  7. 如何系统的学习单片机?
  8. php根据时间搜索,yii2实现根据时间搜索的方法
  9. AttributeError: module ‘tensorflow‘ has no attribute ‘applications‘
  10. 2021牛客暑期多校训练营(二) J. Product of GCDs 不动脑子的莫比乌斯反演做法(