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 与作者交流。