6个版本

0.3.0 2023年9月9日
0.2.0 2023年4月22日
0.1.3 2023年1月10日
0.1.2 2022年3月8日
0.1.0 2021年2月2日

#706 in HTTP服务器

每月45次下载
serveft 中使用

MIT 许可证

40KB
785

Astra

Crate Github Docs

Astra 是基于 hyper 构建的阻塞HTTP服务器。

use astra::{Body, Response, Server};

fn main() {
    Server::bind("localhost:3000")
        .serve(|_req, _info| Response::new(Body::new("Hello World!")))
        .expect("serve failed");
}

它是如何工作的?

Hyper 是基于异步 I/O 构建的,并且依赖于它来正确运行。为了避免依赖于像 Tokio 这样的大型crate,Astra 在后台线程上运行一个小的事件驱动 I/O 循环,并将连接调度到自己的工作池中。区别在于,与像 Tokio 这样的用户空间运行时不同,任务将让步给操作系统。这意味着请求处理器可以使用标准 I/O 原语,而不用担心阻塞运行时

use astra::{Body, ResponseBuilder, Server};
use std::time::Duration;

fn main() {
    Server::bind("localhost:3000")
        .serve(|_req, _info| {
            // Putting the worker thread to sleep will allow
            // other workers to run.
            std::thread::sleep(Duration::from_secs(1));

            // Regular blocking I/O is fine too!
            let body = std::fs::read_to_string("index.html").unwrap();

            ResponseBuilder::new()
                .header("Content-Type", "text/html")
                .body(Body::new(body))
                .unwrap()
        })
        .expect("serve failed");
}

功能

Astra 支持 HTTP/1 和 HTTP/2,并提供了 Hyper 提供的大多数配置选项。然而,依赖于 Tokio 的功能,例如 http2_keep_alive_while_idle,目前不支持,并且被阻塞在 更好的 hyper 支持

Astra 目前仅是一个 HTTP 服务器 库。客户端 API 尚未实现。

安全性

阻塞 I/O 的问题之一是它容易受到诸如 Slowloris 这样的攻击。因此,在异步反向代理如 Nginx 后运行您的服务器非常重要。您可能本来就会这样做以支持 TLS,但这也是需要记住的。

但它速度快吗?

您会发现关于线程每请求性能的许多参考资料都非常过时,通常引用的是在 C10k 达到顶峰规模时的瓶颈。从那时起,线程创建变得显著便宜,上下文切换开销大大降低。现代操作系统调度程序比人们所认为的要好得多,现在使用阻塞 I/O 来服务数万个并发连接是完全可行的。

在简单的“Hello World”风格的HTTP基准测试中,Astra可能落后于Tokio。这部分原因是Astra需要为与Hyper兼容而承担线程和异步I/O的成本。然而,随着每条请求处理的工作量增加,尤其是纯阻塞I/O,这种差异会减小。一如既往,您应该测量自己的用例,但Astra的性能可能会让您感到惊讶。

话虽如此,Astra的主要用例之一是运行轻量级服务器,具有最少的依赖项,并避免异步带来的复杂性,因此任何潜在的性能权衡可能并不重要。

依赖项

~4–16MB
~161K SLoC