1 个不稳定版本
0.1.0 | 2023年7月6日 |
---|
#1 in #模块化
14KB
145 行
Servar - 多功能服务器
目标
Servar 最终设计成能够替代
- netcat
- socat
- Python 的 HTTP 服务
以及几乎任何可以或想要连接到网络的实用工具。我们的设计目标是模块化和跨平台兼容性;这个工具应该在能够编译 Rust 的任何平台上都能很好地工作。
在尽可能结合尽可能多的工具的同时,我们旨在保持标志至少非常相似。
我们也不想抢走任何特定工具的风头。虽然我们试图将各种工具的“核心”功能压缩在一起,但我们并不是试图复制所有专门的功能(至少现在不是)。广度胜于深度。
使用方法
Servar 设计得非常简单易用,大部分灵活性来自于子模块。通过使用 Rust 的 structopt
库,我们能够提供详细且灵活的帮助菜单。
USAGE:
servar [OPTIONS] <SUBCOMMAND>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
OPTIONS:
-i, --ip <ip> Listen IP [default: 0.0.0.0]
-p, --port <port> Listen Port [default: 8000]
SUBCOMMANDS:
help Prints this message or the help of the given subcommand(s)
http-dir Serves a directory via HTTP
要在端口 8080 上通过 HTTP 服务 /tmp 目录: servar -p 8080 htt-dir /tmp
添加模块
添加模块非常简单。源代码树应如下所示
main.rs
module_name/
-> mod.rs
-> module_name.rs
mod.rs
应导出集成所需的两件事。 Args
结构和入口点 exec
函数。
要将它集成到核心工具中,只需要两行代码。第一行添加到 Modes
枚举中的一个条目,第二行添加到入口点的匹配项。
pub enum ServerMode {
HTTPDir(httpdir::Args),
}
------------------------
match args.mode {
ServerMode::HTTPDir(mod_args) => httpdir::exec(gargs, mod_args).await?,
}
这就是全部!随着更多全局参数的添加,这些参数将暴露给模块,而所有特定模块的参数处理都由模块本身完成。
有关此示例,请参阅 httpdir
模块。
结果
目前,仅支持 HTTP 端。以下是一个简单的基准测试,使用 wrk
比较了 Python 模块(顶部结果)和 servar(底部)
❯ ./wrk -t12 -c400 -d30s http://localhost:8000/
Running 30s test @ http://localhost:8000/
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 10.02ms 61.32ms 1.82s 97.98%
Req/Sec 300.42 239.27 1.60k 67.01%
86753 requests in 30.09s, 55.10MB read
Socket errors: connect 0, read 0, write 0, timeout 44
Requests/sec: 2883.49
Transfer/sec: 1.83MB
❯ ./wrk -t12 -c400 -d30s http://localhost:8000/
Running 30s test @ http://localhost:8000/
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 6.50ms 4.34ms 211.01ms 73.87%
Req/Sec 5.30k 677.75 13.70k 96.56%
1899670 requests in 30.10s, 1.04GB read
Requests/sec: 63111.88
Transfer/sec: 35.51MB
如您所见,在相同的 30 秒期间,servar 能够处理超过两倍数量的连接,速度几乎是两倍。
依赖关系
~11–21MB
~288K SLoC