2个版本
使用旧的Rust 2015
0.1.1 | 2018年7月21日 |
---|---|
0.1.0 | 2018年2月21日 |
#1462 in HTTP服务器
61KB
654 行
aitch
aitch是一个简单、轻量级的工具包,用于在安全的、稳定的Rust中构建HTTP服务器。
它基于http
crate,并提供了表示HTTP处理器、体和中间件类型。它提供了hyper
和tiny_http
后端来运行处理器,但旨在与HTTP服务器库无关。
它受到Go的net/http
包的简单性和(流行度)的启发,该包将应用程序/中间件构建为一系列嵌套的Handler
。
aitch利用Rust的类型系统来使这些处理器更容易使用,而不会失去它们的简单性。
示例
extern crate aitch;
extern crate http;
use aitch::servers::hyper::Server;
use aitch::{middlewares, Responder, Result};
use http::Request;
fn handler(_: Request<()>, mut resp: http::response::Builder) -> impl Responder {
resp.body("Hello, world!".to_owned())
}
fn main() -> Result<()> {
let wrapped = middlewares::with_stdout_logging(handler);
let addr = "127.0.0.1:3000".parse()?;
println!("Listening on http://{}", addr);
Server::new(addr, wrapped)?.run()
}
此示例与aitch一起提供。要运行它,克隆此存储库并运行
cargo run --release --example hello-world-sync
请参阅此存储库的examples/
目录中的其他示例
json.rs
,它使用可选的Json<T>
类型来包装结构体,这些结构体在请求/响应体中自动(反)序列化。simple-router.rs
,它使用简单的请求路由器,模仿net/http
'的ServeMux
。shared-context.rs
,展示了如何使用提供的middlewares::with_context
将包含共享资源的结构体注入应用程序的HTTP处理器。examples/static-files.rs
,展示了如何使用提供的handlers::static_files::*
处理器在开发过程中提供静态资产。
依赖项 & 功能
aitch旨在仅提供构建HTTP应用程序所需的最基本的类型,以您选择的任何服务器技术。它旨在在依赖性和运行时成本上保持轻量级,同时仍然易于使用。
为了正常运行,aitch需要少量依赖项:http
、futures
和bytes
。
为了帮助您快速提高生产力,aitch提供了一些可选功能,这些功能目前默认启用
server-hyper
:提供一个Server
,可以使用hyper
网络服务器运行aitch::Handler
。(示例)server-tiny-http
:提供一个Server
,可以使用tiny_http
网络服务器运行aitch::Handler
。(示例)json
:提供一个Json<T>
类型,该类型可以包装任何类型T: serde::Deserialize + serde::Serialize
,使其可以在请求和响应中使用:http::Request<Json<T>>
/http::Response<Json<T>>
。(示例)mime_guess
:使用mime_guess
存储库猜测由包含的handlers::static_files::*
处理器返回的响应的MIME类型。
这些功能将在不久的将来被拆分为单独的存储库。
它是否快速?
它相当快!
在对默认的hello-world-sync
示例(禁用日志记录到stdout
,使用Hyper)进行性能分析时,我们看到了在2015年13英寸MBP上的~130,000 req/s,其中包含12个线程和100个连接。
$ wrk --latency -t12 -c100 -d10s https://127.0.0.1:3000/
Running 10s test @ https://127.0.0.1:3000/
12 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 837.87us 1.15ms 35.88ms 94.35%
Req/Sec 11.09k 1.55k 17.44k 75.25%
Latency Distribution
50% 630.00us
75% 1.06ms
90% 1.61ms
99% 3.45ms
1325352 requests in 10.02s, 135.24MB read
Requests/sec: 132296.91
Transfer/sec: 13.50MB
许可证
MIT
依赖项
~1.3–3.5MB
~61K SLoC