简介

一个 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,ParcelDeno,还有些著名的公司也在使用它,例如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半逆转后的字序,从此可以看出denoNode.js的替代,它的目标是为Typescript/Javascript提供一个更现代化、更安全、更强大 的运行时,同时内置了很多强大的工具,可以用于打包、编译成可执行文件、文档、测试、lint等。

axum - rust 文档地址