Ktor在外部配置文件中使用HOCON(Human-Optimized Config Object Notation)格式。 在此文件中,您可以配置要侦听的端口或要加载的模块等内容。 此格式类似于JSON,但经过优化,可供人类读取和编写,并支持环境变量替换等其他功能。 在这种情况下,您将服务器引擎配置为与指向特定EngineMain的mainClassName一起使用。

  当使用embeddedServer时,Ktor还使用一组带有类型DSL(域特定语言)的lambda来配置应用程序和服务器引擎。

HOCON文件


  这是配置Ktor应用程序的首选方法,因为它允许您轻松更改配置,而无需重新编译应用程序。

  当Ktor使用EngineMain启动时,或者通过调用commandLineEnvironment,它会尝试从应用程序资源加载名为application.conf的HOCON文件。 您可以使用命令行参数更改文件的位置。

可用作mainClassName的可用开发引擎:

  io.ktor.server.cio.EngineMainio.ktor.server.tomcat.EngineMainio.ktor.server.jetty.EngineMainio.ktor.server.netty.EngineMain

  Ktor仅要求您使用ktor.application.modules属性指定在启动服务器时要加载的模块。 所有其他属性都是可选的。

  Ktor(application.conf)的典型简单HOCON文件如下所示:

ktor {deployment {port = 8080}application {modules = [ io.ktor.samples.metrics.MetricsApplicationKt.main ]}
}

  使用.表示法相当于:

ktor.deployment.port = 8080
ktor.application.modules = [ io.ktor.samples.metrics.MetricsApplicationKt.main ]

  Ktor允许您进行更多配置:从其他核心配置到Ktor功能,甚至是应用程序的自定义配置:

ktor {deployment {environment = developmentport = 8080sslPort = 8443autoreload = truewatch = [ httpbin ]}application {modules = [ io.ktor.samples.httpbin.HttpBinApplicationKt.main ]}security {ssl {keyStore = build/temporary.jkskeyAlias = mykeykeyStorePassword = changeitprivateKeyPassword = changeit}}
}jwt {domain = "https://jwt-provider-domain/"audience = "jwt-audience"realm = "ktor app"
}youkube {session {cookie {key = 03e156f6058a13813816065}}upload {dir = ktor-samples/ktor-samples-youkube/.video}
}

注:你可以安装一个用于HOCON的IntelliJ插件。

命令行


  使用commandLineEnvironment(任何EngineMain main)时,可以使用多个开关和配置参数来配置应用程序模块。

  如果从命令行使用-config = anotherfile.conf启动应用程序,它将从特定的本地文件而不是从资源加载配置文件。

java -jar myapp-fatjar.jar -port=8080

配置embeddedServer


   embeddedServer是启动Ktor应用程序的简单方法。 您提供自己的主要功能,并且更明确,更容易理解究竟发生了什么。

  embeddedServer包含一个可选参数configure,允许您设置第一个参数中指定的引擎的配置。 独立于所使用的引擎,您将拥有一些可配置的属性:

embeddedServer(AnyEngine, configure = {// Size of the event group for accepting connectionsconnectionGroupSize = parallelism / 2 + 1// Size of the event group for processing connections,// parsing messages and doing engine's internal work workerGroupSize = parallelism / 2 + 1// Size of the event group for running application code callGroupSize = parallelism
}) {// ...
}.start(true)

多个连接器


  可以使用applicationEngineEnvironment通过代码定义几个连接器。

  在applicationEngineEnvironment中,您可以定义HTTP和HTTPS连接器:

  定义一个HTTP连接器:

connector {host = "0.0.0.0"port = 9090
}

  定义一个HTTPS连接器:

sslConnector(keyStore = keyStore, keyAlias = "mykey", keyStorePassword = { "changeit".toCharArray() }, privateKeyPassword = { "changeit".toCharArray() }) {port = 9091keyStorePath = keyStoreFile.absoluteFile
}

  完整的例子:

fun main(args: Array<String>) {val env = applicationEngineEnvironment {module {main()}// Private APIconnector {host = "127.0.0.1"port = 9090}// Public APIconnector {host = "0.0.0.0"port = 8080}}embeddedServer(Netty, env).start(true)
}

该应用程序将处理所有连接。 您可以访问每个ApplicationCall的本地端口,因此您可以根据本地端口决定要执行的操作:

fun Application.main() {routing {get("/") {if (call.request.local.port == 8080) {call.respondText("Connected to public api")} else {call.respondText("Connected to private api")}}}
}

Netty


使用Netty作为引擎时,除了常用属性外,还可以配置其他一些属性:

embeddedServer(Netty, configure = {// 存储无法立即处理的[ApplicationCall]实例的队列的大小requestQueueLimit = 16 shareWorkGroup = false // 用户提供的功能来配置Netty的[ServerBootstrap]configureBootstrap = {// ...} // 向客户端发送响应的超时(以秒为单位)responseWriteTimeoutSeconds = 10
}) {// ...
}.start(true)

Jetty


使用Jetty作为引擎时,除了常用属性外,还可以配置Jetty服务器。

embeddedServer(Jetty, configure = {// 提供lambda的属性,该lambda将在Jetty服务器初始化期间以服务器实例作为参数进行调用。configureServer = {// ...}
}) {// ...
}.start(true)

CIO


使用CIO(Coroutine I/O)作为引擎时,除了常用属性外,还可以配置connectionIdleTimeoutSeconds属性。

embeddedServer(CIO, configure = {// 服务器将保持HTTP IDLE连接打开的秒数。// 如果没有活动请求正在运行,则连接是IDLE。connectionIdleTimeoutSeconds = 45
}) {// ...
}.start(true)

Tomcat


使用Tomcat时,除了常用属性外,还可以配置Tomcat服务器。

embeddedServer(Tomcat, configure = {// 提供在将Tomcat服务器初始化期间以服务器实例作为参数调用的lambda的属性。configureTomcat { // this: Tomcat ->// ...}
}) {// ...
}.start(true)

可用的配置参数


有一个Ktor可以理解的属性列表,您可以从命令行或HOCON文件传递这些属性。

参数 参数路径 默认值 描述
jar JAR文件的路径
config 配置文件的路径(而不是资源中的application.conf)
host ktor.deployment.host 0.0.0.0 绑定主机
port ktor.deployment.port 80 绑定端口
watch ktor.deployment.watch [] 用于监视重新加载的程序包路径
ktor.application.id Application 用于记录的应用程序标识符
ktor.deployment.callGroupSize parallelism 运行应用程序代码的事件组大小
ktor.deployment.callGroupSize parallelism 运行应用程序代码的事件组大小
ktor.deployment.connectionGroupSize parallelism / 2 + 1 事件组接受连接大小

从代码中读取配置


如果您使用的是EngineMain而不是embeddedServer,则会加载HOCON文件,您可以访问其配置属性。

您还可以定义任意属性路径以配置应用程序。

val port: String = application.environment.config.propertyOrNull("ktor.deployment.port")?.getString()?: "80"

使用环境变量


对于HOCON,如果要使用环境变量配置某些参数,可以使用${ENV}语法来使用环境替换。 例如:

ktor {deployment {port = ${PORT}}
}

如果由于环境不存在而要为属性提供默认值,可以使用默认值设置该属性,然后使用$ {?ENV}语法再次设置该属性:

ktor {deployment {port = 8080port = ${?PORT}}
}

如果您使用的是embeddedServer,您仍然可以使用Java中的System.getenv。 例如:

val port = System.getenv("PORT")?.toInt() ?: 8080

如何区分开发环境


您可能希望根据服务器是在本地运行还是在生产服务器上执行不同的操作。

HOCON & ENV

您可以使用application.conf文件来设置将保存环境的变量,然后在运行时检查该变量并确定要执行的操作。 您可以将其配置为检查环境变量KTOR_ENV并提供默认值dev。 然后在生产中设置KTOR_ENV = prod

ktor {environment = devenvironment = ${?KTOR_ENV}
}

您可以从应用程序访问此配置,并使用一些扩展属性来简化操作:

fun Application.module() {when {isDev -> {// Do things only in dev   }isProd -> {// Do things only in prod}}// Do things for all the environments
}val Application.envKind get() = environment.config.property("ktor.environment").getString()
val Application.isDev get() = envKind == "dev"
val Application.isProd get() = envKind != "dev"

7、Ktor学习-配置服务器;相关推荐

  1. 学习如何合理的配置服务器

    专业与IDC行业,有幸与您合作 ​关注他 创作声明:内容包含虚学习如何合理的配置服务器构创作 一.网络服务器配置的基本情况 1.服务器配置之前的工作 首先是对有关域名服务系统的组件进行安装,在现在计算 ...

  2. 从深度学习计算过程来分析深度学习工作站\服务器的硬件配置

    柯洁和AlphaGo的故事已经结束,输赢显得并不重要,这个天才少年曾落泪哽咽:它太完美我看不到希望.搭载谷歌无人驾驶技术的车辆已经完成200万英里的测试,如今它打算要载人了,无人驾驶真的已经不远.在苹 ...

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

    在外部主机中运行应用程序   当您需要在独立维护的主机(例如Tomcat)中运行Ktor应用程序时,您需要一个application.conf文件来告诉Ktor如何启动您的应用程序. 定义配置   在 ...

  4. 2、Ktor学习-自动重新加载;

       在开发过程中,快速反馈循环周期非常重要. 通常,重新启动服务器可能需要一些时间,因此Ktor提供了一个基本的自动重载工具,可以重新加载Application类. 注:自动重载不支持java 9, ...

  5. 2021-04-17 安装Ubuntu18.0.4 的深度学习训练服务器

    序言: 过去安装系统,总是从互联网看看别人如何装,照猫画虎就稀里糊涂地装上了.但是并不知道版本之间的关系,以至于下次安装依然临时拍脑决定,这样安装的坏处是,以后运行时可能遇到莫名的错误.如今安装服务器 ...

  6. @scheduled注解配置时间_Spring Cloud 之配置服务器(下)配置刷新

    学习目标 本文所讲内容为上一文的后续,我们在上一文中学习了什么是 Spring Cloud 的配置服务器:如何使用两种方式搭建 Spring Cloud Config Server 以及客户端如何连接 ...

  7. 网络协议从入门到底层原理(8)HTTPS(成本、通信过程、TLS1.2的连接,配置服务器HTTPS)

    HTTPS SSL / TLS OpenSSL HTTPS的成本 HTTPS的通信过程 TLS 1.2 的连接(ECDHE密钥交换算法) ① Client Hello ② Server Hello ③ ...

  8. 申请阿里云服务器并配置SSL证书(附带微信公众号配置服务器)

    首先大家要了解到自己的笔记本连接wifi是没有公网的,当然建议大家在公司测试,毕竟在工作空余时间学习学习提升一下技术还是比较好的 首先服务器配置,最重要的一点 要有自己的服务器, 如果有公网的话 可以 ...

  9. 关于深度学习云服务器推荐

    关于深度学习云服务器推荐 免费的云服务器 免费+付费的云服务器 付费的云服务器 2022.2.7 更新推荐新的付费云服务器 自己也是最近才开始接触到机器学习和深度学习,很直观的一个感受就是跑起代码来特 ...

最新文章

  1. zabbix action 执行远程命令
  2. hive load data inpath 空目录_Hive内部表 | 每日五分钟学大数据
  3. 自定义SeekBarPreference控件(老外出品,直接在preferences文件中使用,无需其他代码)...
  4. source tree 递归子模块_多模块 Spring Boot 项目
  5. 最大字段和(动态规划,C语言)
  6. 汇成企业网站管理系统v1.0源码
  7. mysql编号用什么类型_mysql 之编码配置、引擎介绍、字段操作、数据类型及约束条件...
  8. OpenShift 4之实现一个基于Gogs+Nexus+Sonarqube的Jenkins CI/CD Pipeline
  9. sip消息类型和消息代码详解-转
  10. ACM程序设计选修课——1036: Hungar的菜鸟赛季(YY)
  11. 大数据体系的4个热点4个趋势,还有3个疑问
  12. 实现房源15天后自动下架记录
  13. 上海自考02290 c++语言程序设计试卷,上海交通大学工业自动化专业自考本科招生简章...
  14. 如何制作一个蓄力跳的功能
  15. C#+Selenium+Nunit demo
  16. c语言程序设计:现代方法 勘误,C语言程序设计基础教程----勘误记录
  17. 我为什么要进国企——HP大中华区总裁孙振耀退休感言
  18. 计算机水平模拟软件卸载不了怎么办,有的软件卸载不了怎么办
  19. poi操作Excel并修改单元格背景色
  20. iOS 视频播放器开发

热门文章

  1. 根据href给当前导航添加样式
  2. 电脑控制Android设备的软件——Total Control
  3. Linq学习之路(07) - 使用Linq进行参数化编程step by step
  4. 常用数据挖掘算法举例(上)
  5. JZOJ 3504. 运算符(calc)
  6. JS函数生成器,function* () {}
  7. Java:基于LinkedList实现栈和队列
  8. 你不懂,仅仅有程序猿懂
  9. 关于头文件的一道选择题
  10. Python中yield的作用??