kotlin - Ktor 服务器的一个实例上有多个站点

标签 kotlin server ktor

我想要一个 Ktor 应用程序为多个站点提供服务。 (一个站点=一个域) 我还希望能够在不重新启动 Ktor 服务器的情况下添加和删除站点。(这是我无法解决的主要问题)

我在文档中找到了这样的功能,但我不明白是否可以动态添加新端口? enter image description here

如果您有任何想法如何解决我的问题,请告诉我?

最佳答案

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/

相关文章:

Kotlin:将构造函数传递给函数式接口(interface)

ubuntu - 权限被拒绝(公钥、密码)。在使用 ssh 登录时

ktor - 如何在 Ktor 中使用自定义配置?

kotlin - IntelliJ在新的Ktor项目中缺少对slf4j的引用

android - kotlinx.serialization.SerializationException : Serializer for class 'MultiPartFormDataContent' is not found

android - 如何实现 Room 实体的继承(Android、Kotlin)

android - 当 LiveData<MVoice> 在 Android Studio 中的双向数据绑定(bind)中更改时,如何重置 LiveData<Boolean>?

android - 更新当前列表项

windows - 如何在 IIS7 Windows Server 2008 R2 上启用 TLS1.2

linux - 如何将我的电脑上当前的node.js开发设置部署到物理ubuntu服务器?