我想要一个 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?
关于kotlin - Ktor 服务器的一个实例上有多个站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65138312/