在之前学习 Exposed ORM 的时候,偶然得知 Ktor 这样一个项目,简单了解了一下之后发现这是一个 Kotlin 编写的异步网络编程框架,Ktor 既可以作为服务端框架,实现 HTTP 服务,也可以作为 HTTP 客户端,在 Android 等平台上使用。

Ktor 是什么

Ktor 完全基于 Kotlin 和 Coroutines 构建,可以使用简洁的跨平台语言,直观的命令式,来实现异步编程。

  • 轻量,Ktor 允许开发者仅使用所需的组件
  • 异步和非阻塞,框架底层使用异步 IO,避免线程阻塞,能够高效处理大量并发请求
  • Kotlin 原生支持

作为服务端

Ktor 提供了简洁强大的路由系统。

routing {
    get("/hello") {
        call.respondText("Hello, Ktor!")
    }
    post("/users") {
        // 处理用户创建请求
    }
}

路由支持嵌套结构和参数提取,使得复杂的 URL 模式处理变得简单。

Ktor 的插件系统是其最强大的特性之一。插件在请求-响应管道的不同阶段进行拦截和处理,提供了极大的灵活性:

  • 认证与授权:支持 JWT、OAuth、基础认证等多种认证方式
  • 内容协商:自动处理 JSON、XML 等格式的序列化和反序列化
  • 压缩:提供 Gzip 和 Deflate 压缩支持
  • CORS:跨域资源共享配置
  • 会话管理:灵活的会话存储和管理

Ktor 内置了多种序列化格式的支持,包括 JSON,XML,CBOR,Protobuf 等。

优势

Ktor 的核心优势在于性能,在高并发场景下,基于协程的异步处理模型可能以更少的资源来处理更多的并发请求。

在开发效率上,Ktor API 设计简洁,并且相比于 Spring Boot 的笨重,Ktor 通常在 1 秒内就可以完成服务启动。

作为服务端的场景,Ktor 特别适合

  • 微服务架构
  • 高性能 API 开发
  • 实时应用 WebSocket 支持
  • 轻量级 Web 服务
  • 多平台项目

在 Ktor 3.0 中也增加了对 [[Server-Sent Events 服务器信息推送]] 支持。

作为客户端

Ktor 还可以作为一个异步 HTTP 客户端,并且通过 Kotlin 天然地支持多平台,比如在 Android 或者客户端上运行。

Retrofit 更合适

  • 传统的 HTTP API 接口
  • 自动解析 JSON
  • 可以快速接入 Java/Android 项目
  • 依赖 RxJava
  • 实现重试,缓存和日志记录

Ktor 更合适

  • 全新的 Kotlin 项目,尤其是跨平台项目
  • 需要自定义协议,比如 WebSocket/HTTP2/SSE 等
  • 服务端和客户端共享网络逻辑的场景
  • 如果使用 [[Kotlin Multiplatform]] 构建跨平台程序,使用 Ktor 可以确保所有平台使用相同的逻辑
  • 有一个基于 Ktor 受到 Retrofit 启发的项目 Ktorfit
  • [[Retrofit]]
  • [[OkHttp]]

reference