Rust后端框架+docker的选择与技术调研

star数量趋势

2023 年可以关注的 Rust Web 框架(后端) - 知乎 (zhihu.com)

框架 适合规模 性能 代码写法 社区活跃 是否含前端模板 socket 文档
actix-web 中到大型 非常出色 简洁 非常好 优秀
axum 中到大型 良好 现代化 较好 良好
warp 小到中型 非常出色 函数式 一般 不足
rocket 小到中型 良好 易用 一般 一般

最开始用的是warp,但发现这个代码的简洁程度好像没有其他的好。

接下来的首选肯定是actix-web。但一上来就给我整了个报错。

试了一下axum倒是没有那么不顺利。

https://crates.io/crates/axum
https://docs.rs/axum/latest/axum/

需要写再toml里的东西:

1
2
3
4
5
6
# json 序列化
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }

axum = "0.7.4"
tokio = { version = "1", features = ["full"] }

axum在2024年3月14日已经0.7了,问chatGPT3.5他还会按照0.4的来回答你。这个axum在API方面的变动还是有的。

axum库的代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use axum::{
response::Json,
routing::{get, post},
Router,
};
use serde::{Deserialize, Serialize};
use serde_json::{json, Value};

#[derive(Debug, Deserialize, Serialize)]

pub struct User {
pub account: String,
}

#[tokio::main]
async fn main() {
// build our application with a single route
let app = Router::new()
.route("/", get(root))
.route("/test", get(test))
.route("/p", post(post_foo))
.route("/foo/bar", get(foo_bar));

let listener = tokio::net::TcpListener::bind("0.0.0.0:9999").await.unwrap();
axum::serve(listener, app).await.unwrap();
}

// which calls one of these handlers
async fn root() -> &'static str {
"hello axum"
}

async fn test() -> Json<Value> {
Json(json!({ "output": "2/n", "time": 2}))
}

async fn post_foo(Json(payload): Json<User>) -> &'static str {
println!("{:?}", payload);
"abab"
}

async fn foo_bar() -> &'static str {
"abab"
}

🐳 🦀rust+docker

接下来是选择一个连接并操作Docker的rust第三方库:

github star量 issuee pr 开发者 文档完善 开源协议
bollard 693 28 4 73 Apache-2.0 license
shiplift 610 47 15 61 MIT license
dockworker 56 23 3 31

信息来自2024年3月14日的数据。

光看名字以为dockworker是最官方的,结果github上star量才56

所以接下来就是对比前两个库的过程

从github CodeFrequency 来看,bollard库明显好,最近还在更新,shiplift从2022年开始就没怎么更新过了。

bollard库的依赖更多,有4页,shiplift 只有两页。

现在看来,选择bollard已经没有什么悬念了。