#http-framework #系统 #同步 #线程 #性能 #路由 #响应

乐美特

一个闪电般的快速http框架

4个版本

0.2.1 2023年10月7日
0.2.0 2023年10月6日
0.1.2 2023年9月22日
0.1.1 2023年9月22日
0.1.0 2023年9月22日

480HTTP服务器 中排名

每月下载量 37

MIT 许可证 MIT

39KB
882

乐美特

Rust的同步HTTP框架

Minimum Supported Rust Version Crates.io Docs.rs Code Size Maintained License

乐美特是一个简单、快速、为完成项目而构建的同步框架。

特性

  • 闪电般的性能 (~600k req/sec 在ryzen 7 5700x上使用 wrk)
  • 内置的线程系统,允许您高效地处理请求。
  • 完全没有异步元素,提高了用户体验。
  • 最小化构建大小,剥离后为500kb。
  • 使用您可能已经熟悉的模型库 http
  • 魔法函数处理程序!请参阅 入门指南
  • 独特的路由系统

入门指南

乐美特使用一组处理程序系统和路由模块来处理请求和响应。
以下是一个简单的Hello World服务器示例。

use vegemite::{run, sys, Get, Route, Response};
 
fn get(_get: Get) -> Response<String> {
    let content = String::from("<h1>Hello World</h1>");
 
    Response::builder()
        .status(200)
        .body(content)
        .unwrap()
} 
 
fn main() {
    let router = Route::new(sys![get]);
 
    run("127.0.0.1:8080", router);
} 

让我们将其分解为其组成部分。

路由

路由器将按其部分逐步遍历页面,首先从路由开始。它将尝试运行它遍历的每个节点的所有系统。一旦收到响应,它将停止遍历请求。

假设我们有一个路由器 Route::new(sys![auth]).route("page", Route::new(sys![get_page])) 和请求 /page

在这个例子中,我们将首先调用 auth,如果认证返回响应,比如用户未经授权,我们希望提前响应,然后我们在这里停止。否则,我们继续到下一个节点 get_page

如果没有返回响应,服务器将自动返回 404。这将在未来可配置。

参数/守卫

函数参数在 vegemite 中既可以作为获取器也可以作为守卫使用。

在上面的示例中,Get充当守卫,以确保系统仅在GET请求上运行。

任何实现特质的类型Resolve<Output = ResolveGuard<Self>>都可以作为参数使用。

vegemite将尝试提供您最常用的守卫和获取器,但目前实现的并不多。

示例

pub struct Get;

impl Resolve for Get {
    fn resolve(ctx: &mut Context) -> ResolveGuard<Self> {
        if ctx.request.method() == Method::GET {
            ResolveGuard::Value(Get)
        } else {
            ResolveGuard::None
        }
    }
}

返回类型

系统需要返回一个实现MaybeIntoResponse的值。

此外,请注意IntoResponse的存在,它为始终返回响应的任何类型自动实现MaybeIntoResponse

如果类型从None返回,则不会发送响应,并且路由将继续到后续节点。

示例

impl IntoResponse for u16 {
    fn response(self) -> RawResponse {
        Response::builder()
            .version(Version::HTTP_10)
            .status(self)
            .header("Content-Type", "text/plain; charset=UTF-8")
            .header("Content-Length", "0")
            .body(Vec::new())
            .expect("Failed to build request")
    }
}

贡献

如果您有关于功能或改进的建议,请随时提交问题或拉取请求!

许可

MIT许可(LICENSE或https://opensource.org/licenses/MIT

依赖

~580KB