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 中使用
40KB
785 行
Astra
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