简介
一个 HTTP Server 内部包括很多部分:协议实现(h1、h2、压缩等)、连接状态管理(keepalive)、请求分发、中间件、业务逻辑等。用户可以全部自行实现,但其实除了业务逻辑之外的部分都是较为通用的能力。我们将这些通用能力与用户的业务逻辑解耦,即 HTTP 框架。
由于 rust 生态中 hyper 已经提供了较为完备的 HTTP 协议实现,基于 hyper 实现 HTTP 框架就只需要提供包括路由、共享状态、中间件等能力。
本文从 HTTP 框架的设计角度,以新版本 Axum 作为例子,分析 rust 下 HTTP 框架如何提供合理抽象与类型约束。基于 rust 强大的类型系统,我们可以写出高效且正确的代码。
cross-rs
Handler抽象
简单路由
用户接口
共享状态
路由
中间件
Tokio 是 rust 编程语言的异步运行时。它提供了编写网络应用进程所需的构建块。它提供了针对各种系统的灵活性,从具有数十个内核的大型服务器到小型嵌入式设备。
在高层次上,Tokio 提供了几个主要组件:
用于执行异步代码的多线程运行时。 标准库的异步版本。 一个大型的生态库。
以异步方式编写应用进程时,可以通过同时降低多个执行操作的成本来使其更好地扩展。但是,异步 rust 代码不会自行运行,因此您必须选择一个运行时来执行它。Tokio 库是使用最广泛的运行时,超过了所有其他运行时的总和。
此外,Tokio 还提供了许多有用的实用程序。在编写异步代码时,你不能使用 rust 标准库提供的普通阻塞 API,而必须使用它们的异步版本。这些替代版本由 Tokio 提供,替代了 rust 标准库的 API。
tauri可以用来更小、更快、更安全的桌面应用,它想要替代的是electro.js。
[swc](https://github.com/swc-project/swc)是Typescript/Javascript编译器,它可以用来编译、压缩和打包JS,同时支持使用插件进行扩展,例如做代码变换等。
swc目前正在被一些知名项目所使用,包括Next.js,Parcel和Deno,还有些著名的公司也在使用它,例如Vercel、字节跳动、腾讯等。
它的性能非常非常高,官方号称,在单线程下比Babel快20倍,在4核心下比Babel快70倍!
本地嵌入式数据库
let tree = sled::open("/tmp/welcome-to-sled")?;
// insert and get, similar to std's BTreeMap
let old_value = tree.insert("key", "value")?;
assert_eq!(
tree.get(&"key")?,
Some(sled::IVec::from("value")),
);
// range queries
for kv_result in tree.range("key_1".."key_9") {}
// deletion
let old_value = tree.remove(&"key")?;
// atomic compare and swap
tree.compare_and_swap(
"key",
Some("current_value"),
Some("new_value"),
)?;
// block until all operations are stable on disk
// (flush_async also available to get a Future)
tree.flush()?;
[deno](https://github.com/topics/rust?l=rust&o=desc&s=stars)是node半逆转后的字序,从此可以看出deno是Node.js的替代,它的目标是为Typescript/Javascript提供一个更现代化、更安全、更强大 的运行时,同时内置了很多强大的工具,可以用于打包、编译成可执行文件、文档、测试、lint等。
axum - rust 文档地址