2个不稳定版本
0.1.0 | 2020年7月28日 |
---|---|
0.0.1 | 2020年6月20日 |
#323 in 文本编辑器
55KB
1.5K SLoC
mini-async-http
mini-async-http是一个小巧的http服务器。我构建它是为了练习和学习Rust语言。它基于mio库进行所有相关的异步I/O操作。
示例
您可以使用以下代码创建服务器
extern crate mini_async_http;
use mini_async_http::AIOServer;
use mini_async_http::ResponseBuilder;
pub fn main(){
let mut server = AIOServer::new(3, "0.0.0.0:7878", move |request|{
ResponseBuilder::empty_200()
.body(b"Hello")
.content_type("text/plain")
.build()
.unwrap()
});
server.start();
}
这里服务器使用3个工作线程创建,并将绑定到端口7878。当收到新请求时,响应体设置为"Hello",并发送。
您可以使用Rust的同步机制在调用之间共享状态。这里是一个简单的计数器的示例,每次请求都会递增
extern crate mini_async_http;
use mini_async_http::AIOServer;
use mini_async_http::ResponseBuilder;
use std::sync::{Arc, Mutex};
pub fn main() {
let counter = Arc::from(Mutex::from(0));
let mut server = AIOServer::new(3, "0.0.0.0:7878", move |request| {
let lock = counter.clone();
let mut counter = lock.lock().unwrap();
let body = counter.to_string();
*counter += 1;
ResponseBuilder::empty_200()
.body(body.as_bytes())
.content_type("text/plain")
.build()
.unwrap()
});
server.start();
}
架构
此实现基于mio。所有新的连接和请求都由事件循环处理。事件循环处理4种不同类型的事件
-
新连接:当新客户端连接时,结果TCP流被注册到mio注册表中,以便在通过此连接接收到数据时被通知。
-
新数据:可读取的流可用。该流被发送到工作池进行处理。
-
连接关闭:连接已被客户端或服务器本身关闭。它必须从监视列表中删除并丢弃。
-
服务器关闭:服务器正在关闭,现在正在等待工作线程停止以结束事件循环。
重要的是在事件循环中不进行任何计算,因为它是服务器性能的核心。
依赖项
~0.6–1MB
~16K SLoC