在之前学习 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
related
- [[Retrofit]]
- [[OkHttp]]