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种不同类型的事件

  1. 新连接:当新客户端连接时,结果TCP流被注册到mio注册表中,以便在通过此连接接收到数据时被通知。

  2. 新数据:可读取的流可用。该流被发送到工作池进行处理。

  3. 连接关闭:连接已被客户端或服务器本身关闭。它必须从监视列表中删除并丢弃。

  4. 服务器关闭:服务器正在关闭,现在正在等待工作线程停止以结束事件循环。

重要的是在事件循环中不进行任何计算,因为它是服务器性能的核心。

依赖项

~0.6–1MB
~16K SLoC