Building Complex Servers

预计阅读时间:3分钟

根据服务器代码的复杂性,您可能希望以一种或另一种方式来构造代码. 该页面提出了一些策略,可以根据代码的复杂性来结构化代码,以适应代码的增长,同时保持代码尽可能的简单.

目录:

Hello World

要开始使用Ktor,您可以在一个简单的main函数中从embeddedServer开始.

fun main(args: Array<String>) {
    embeddedServer(Netty, port = 8080) {
        routing {
            get("/") {
                call.respondText("Hello World!")
            }
        }
    }.start(wait = true)
}

可以很好地理解Ktor的工作原理,并使所有应用程序代码一目了然.

Defining modules

您可以将配置服务器(也称为Ktor模块)的代码提取为扩展方法:

fun main(args: Array<String>) {
    embeddedServer(Netty, port = 8080, module = Application::mainModule).start(wait = true)
}

fun Application.mainModule() {
    routing {
        get("/") {
            call.respondText("Hello World!")
        }
    }
}

Extracting routes

一旦代码开始增长,并且定义了更多的路由,您可能会希望拆分代码,而不是无限期地扩展主函数.

一种简单的方法是使用Routing类作为接收器将Routing提取到扩展方法中.

根据大小,也许仍然将其保存在同一文件中,或者可以将其移动到其他文件:

fun main(args: Array<String>) {
    embeddedServer(Netty, port = 8080, module = Application::mainModule).start(wait = true)
}

fun Application.mainModule() {
    routing {
        root()
    }
}

// Extracted route
fun Routing.root() {
    get("/") {
        call.respondText("Hello World!")
    }
}

routing { ... }块内部有一个隐式的this: Routing ,可以直接调用root方法,实际上就像调用this.root() .

Deployment and application.conf

一旦要部署服务器,您可能还希望在不重新编译的情况下从外部提供或更改服务器的配置.

Ktor库公开了一些入口点,这些入口点从资源或通过外部文件读取application.conf文件. 在此文件中,您可以定义诸如应用程序的入口点,使用的端口,ssl配置或任意配置之类的内容.

您可以在配置页面中阅读有关使用application.conf更多信息.

Health checks

根据您的应用程序,您可能需要使用不同的方法来创建运行状况检查. 最简单的方法是启用一个像/health_check这样的端点,该端点返回类似HTTP 200 OK东西,同时可以选择验证您的依赖服务. 这完全取决于您.

您还可以使用StatusPages功能来处理异常.

install(StatusPages){
    exception<Throwable> { cause ->
        call.respond(HttpStatusCode.InternalServerError)
    }
}
routing {
    get("/health_check") {
        // Check databases/other services.
        call.respondText("OK")
    }
}

by  ICOPY.SITE