新一代Rust Web框架高性能之选现代开发技术与架构设计最佳实践(1750500722497000)

0 阅读1分钟

Hyperlane:新一代高性能 Rust 框架的实战体验

性能亮点:令人惊艳的压测数据

Hyperlane 作为新一代 Rust Web 框架,其性能表现令人惊艳。以下是我们进行的严格压测结果:

高并发持续压力测试

wrk -c360 -d60s http://127.0.0.1:60000/

[!tip] 测试 360 并发,持续 60s 请求。QPS 结果如下:

  • 1 Tokio :340130.92
  • 2 Hyperlane框架 :324323.71
  • 3 Rocket框架 :298945.31
  • 4 Rust标准库 :291218.96
  • 5 Gin框架 :242570.16
  • 6 Go标准库 :234178.93
  • 7 Node标准库 :139412.13

百万请求高并发测试

ab -n 1000000 -c 1000 -r -k http://127.0.0.1:60000/

[!tip] 测试 1000 并发,一共 100w 请求。QPS 结果如下:

  • 1 Tokio :308596.26
  • 2 Hyperlane框架 :307568.90
  • 3 Rocket框架 :267931.52
  • 4 Rust标准库 :260514.56
  • 5 Go标准库 :226550.34
  • 6 Gin框架 :224296.16
  • 7 Node标准库 :85357.18

从数据可以看出,Hyperlane 框架的性能几乎接近底层 Tokio 运行时,远超其他主流框架,是构建高性能 Web 服务的理想选择。

完整使用示例

use hyperlane::*;

async fn request_middleware(ctx: Context) {
    let socket_addr: String = ctx.get_socket_addr_or_default_string().await;
    ctx.set_response_header(SERVER, HYPERLANE)
        .await
        .set_response_header(CONNECTION, KEEP_ALIVE)
        .await
        .set_response_header(CONTENT_TYPE, TEXT_PLAIN)
        .await
        .set_response_header("SocketAddr", socket_addr)
        .await;
}

async fn response_middleware(ctx: Context) {
    let _ = ctx.send().await;
}

#[methods(get, post)]
async fn root_route(ctx: Context) {
    ctx.set_response_status_code(200)
        .await
        .set_response_body("Hello hyperlane => /")
        .await;
}

#[get]
async fn ws_route(ctx: Context) {
    let key: String = ctx.get_request_header(SEC_WEBSOCKET_KEY).await.unwrap();
    let request_body: Vec<u8> = ctx.get_request_body().await;
    let _ = ctx.set_response_body(key).await.send_body().await;
    let _ = ctx.set_response_body(request_body).await.send_body().await;
}

#[post]
async fn sse_route(ctx: Context) {
    let _ = ctx
        .set_response_header(CONTENT_TYPE, TEXT_EVENT_STREAM)
        .await
        .set_response_status_code(200)
        .await
        .send()
        .await;
    for i in 0..10 {
        let _ = ctx
            .set_response_body(format!("data:{}{}", i, HTTP_DOUBLE_BR))
            .await
            .send_body()
            .await;
    }
    let _ = ctx.closed().await;
}

async fn dynamic_route(ctx: Context) {
    let param: RouteParams = ctx.get_route_params().await;
    panic!("Test panic {:?}", param);
}

async fn on_ws_connected(ctx: Context) {
    let _ = ctx.set_response_body("connected").await.send_body().await;
}

fn error_handler(error: String) {
    eprintln!("{}", error);
    let _ = std::io::Write::flush(&mut std::io::stderr());
}

async fn main() {
    let server: Server = Server::new();
    server.host("0.0.0.0").await;
    server.port(60000).await;
    server.enable_nodelay().await;
    server.disable_linger().await;
    server.http_line_buffer_size(4096).await;
    server.ws_buffer_size(4096).await;
    server.error_handler(error_handler).await;
    server.on_ws_connected(on_ws_connected).await;
    server.before_ws_upgrade(request_middleware).await;
    server.request_middleware(request_middleware).await;
    server.response_middleware(response_middleware).await;
    server.route("/", root_route).await;
    server.route("/ws", ws_route).await;
    server.route("/sse", sse_route).await;
    server.route("/dynamic/{routing}", dynamic_route).await;
    server
        .route("/dynamic/routing/{file:^.*$}", dynamic_route)
        .await;
    server.run().await.unwrap();
}

开始使用 Hyperlane

安装

cargo add hyperlane

快速开始

git clone https://github.com/eastspire/hyperlane-quick-start.git
cd hyperlane-quick-start
cargo run

了解更多

如果你对 Hyperlane 感兴趣,欢迎访问 GitHub 仓库 获取最新信息,或查看 官方文档 了解详细使用指南。有任何问题或建议,也欢迎通过 root@ltpp.vip 与作者交流。