kotlin - Ktor 服务器的一个实例上的多个站点
问题描述
我想要一个 Ktor 应用程序来服务多个站点。(一个站点=一个域)我还希望能够在不重新启动 Ktor 服务器的情况下添加和删除站点。(这是我无法解决的主要问题)
我在文档中找到了这样的功能,但我不明白我是否可以动态添加新端口?
如果您有任何想法,请告诉我如何解决我的问题?
解决方案
connector
只是一个函数,因此您可以根据需要多次调用它:
val APPS = mapOf(
8080 to "Hello from 8080",
9090 to "Hola desde 9090"
)
fun main() {
val env = applicationEngineEnvironment {
module {
main()
}
APPS.forEach {
connector {
host = "127.0.0.1"
port = it.key
}
}
}
embeddedServer(Netty, env).start(true)
}
fun Application.main() {
routing {
get("/") {
val port = call.request.local.port
call.respondText(APPS[port] ?: "Who are you?", ContentType.Text.Plain)
}
}
}
➜ ~ curl localhost:8080
Hello from 8080
➜ ~ curl localhost:9090
Hola desde 9090
尽管如果您只打算提供 HTTP 请求,那么由主机识别并在同一端口上运行应用程序可能是一个好主意:
val APPS = mapOf(
"first-client.app.local:8080" to "Hello dear first client",
"second-client.app.local:8080" to "Hola amigo"
)
fun main() {
val server = embeddedServer(Netty, port = 8080) {
routing {
get("/") {
val host = call.request.headers["HOST"]
call.respondText(APPS[host] ?: "Who are you?", ContentType.Text.Plain)
}
}
}
server.start(wait = true)
}
要在本地进行测试,您需要将这些行添加到/etc/hosts
:
127.0.0.1 first-client.app.local
127.0.0.1 second-client.app.local
接着
➜ ~ curl http://first-client.app.local:8080/
Hello dear first client
➜ ~ curl http://second-client.app.local:8080/
Hola amigo
➜ ~ curl http://localhost:8080/
Who are you?
推荐阅读
- oracle - 数据分组 10 秒。PLSQL
- python - 如何替换句子中除一个以外的所有字符
- reactjs - 在 createTheme() 中添加自定义主题变量
- selenium-webdriver - 如何在不需要任何接受或拒绝条件的 Web 应用程序中为“警报弹出”编写代码
- python - Linear transformation for noisy data in python
- node.js - Dockerized Next.js 内存不足(OOM:代码 137),但数字不会添加到最大内存
- sql - SQL server - 创建一个视图以针对 3 个表验证列并获取 RECID 的最大记录
- apache-spark - 在 Spark SQL 的 collect_set 函数中指定分隔符
- vue.js - 如何通过单击 Vue.js 中的背景来关闭模式
- database - What is the differences between the term SSTable and LSM Tree