1 个不稳定版本

0.1.0 2023年7月6日

#1 in #模块化

MIT 许可证

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