Hyperlane 框架详解与使用指南

hyperlane 是一个高性能且轻量级的 Rust HTTP 框架,设计目标是简化现代 Web 服务的开发,同时兼顾灵活性和性能表现。本文将详细介绍 hyperlane 框架的核心功能、API 设计、生命周期模型、路由支持及性能测试结果,帮助开发者快速掌握和应用该框架。


1. ctx 的额外封装与简化调用

hyperlane 中,Context(简称 ctx)封装了请求和响应的各种信息。框架对 ctx 进行了扩展,使得调用请求和响应的子字段方法更加简洁。

例如,request 结构体原有方法 get_method(),传统调用方式是:

let method = ctx.get_request().await.get_method();

hyperlane 允许直接调用简化后的接口:

let method = ctx.get_request_method().await;

调用规则:

  • get 方法名后加子字段名称(小写,用下划线分隔),例如 get_method -> get_request_method
  • set 方法名后同样加子字段名称,例如 set_status_code -> set_response_status_code

此设计极大提升了代码的简洁性与可读性。


2. 请求方法宏(HTTP Methods)

hyperlane 提供了多种请求方法宏,用于路由函数标记允许的 HTTP 方法:

  • 支持组合多个方法,使用 #[methods(get, post)]
  • 支持单一方法简写,如 #[get]#[post] 等。
  • 默认无宏时,路由允许所有请求方法访问。

示例:

#[methods(get, post)]
async fn root_route(ctx: Context) {ctx.set_response_status_code(200).await;ctx.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;ctx.set_response_body(key).await.send_body().await;ctx.set_response_body(request_body).await.send_body().await;
}

3. 响应相关 API

获取响应信息

  • 获取完整响应:

    let response: Response = ctx.get_response().await;
    
  • 获取响应版本:

    let version: ResponseVersion = ctx.get_response_version().await;
    
  • 获取响应状态码:

    let status_code: ResponseStatusCode = ctx.get_response_status_code().await;
    
  • 获取响应原因短语:

    let reason_phrase: ResponseReasonPhrase = ctx.get_response_reason_phrase().await;
    
  • 获取响应头及单个响应头:

    let headers: ResponseHeaders = ctx.get_response_headers().await;
    let value: ResponseHeadersValue = ctx.get_response_header("key").await;
    
  • 获取响应体(支持二进制、字符串、JSON 反序列化):

    let body: ResponseBody = ctx.get_response_body().await;
    let body_string: String = ctx.get_response_body_string().await;
    let body_json: T = ctx.get_response_body_json::<T>().await;
    

设置响应

  • 设置响应体:

    ctx.set_response_body(vec![]).await;
    
  • 设置响应头(响应头 key 不区分大小写,和请求头不同):

    ctx.set_response_header("server", "hyperlane").await;
    
  • 设置状态码:

    ctx.set_response_status_code(200).await;
    

发送响应

  • 发送完整 HTTP 响应:

    • send() 发送响应后保持 TCP 连接。
    • send_once() 发送响应后立即关闭 TCP 连接。
    let res = ctx.set_response_body("hello").send().await;
    let res = ctx.set_response_body("hello").send_once().await;
    
  • 发送响应体(支持多次发送):

    let res = ctx.set_response_body("chunk").send_body().await;
    let res = ctx.set_response_body("chunk").send_once_body().await;
    

4. 中间件洋葱模型

hyperlane 的请求处理采用洋葱模型(Onion Model)中间件设计:

Request
Response
Client
Request Middleware 1
Request Middleware 2
Request Middleware 3
Controller
Response Middleware 1
Response Middleware 2
Response Middleware 3
Client

中间件层层嵌套,保证请求与响应处理顺序清晰,方便扩展和功能解耦。


5. 生命周期演进(版本区别)

  • v3.0.0 以下版本

    • 先执行同步路由。
  • v3.0.0<v4.0.0

    • 先执行异步中间件(保证注册顺序)
    • 再执行同步路由(如果有同步路由则异步路由不执行)
    • 最后执行异步路由
  • v4.0.0 及以上

    • 先执行所有异步中间件(按注册顺序)
    • 再执行所有异步路由(按注册顺序)
  • v4.22.0 及以上

    • 先处理所有异步请求中间件
    • 再执行异步路由
    • 最后处理所有异步响应中间件
  • v4.89.0 及以上

    • 支持调用 ctx.aborted() 来中止后续流程,控制请求生命周期。
  • v5.25.1 及以上

    • 支持调用 ctx.closed() 来停止后续响应发送,结束当前请求 TCP 连接。

6. WebSocket 生命周期

Request
Response
Client
before_ws_upgrade
ws_upgrade
on_ws_connected
Request Middleware 1
Request Middleware 2
Request Middleware 3
Controller
Response Middleware 1
Response Middleware 2
Response Middleware 3
Client

7. 路由支持

静态路由

  • 框架支持静态路由,重复注册相同路径时会抛出异常并退出。
server.route("/test", |ctx: Context| {}).await;

动态路由

  • 使用 {} 包裹参数支持动态路由
  • 支持正则表达式匹配
朴素动态路由
server.route("/test/{text}", |ctx: Context| {}).await;
正则表达式动态路由
server.route("/test/{number:\\d+}", |ctx: Context| {}).await;
获取动态路由参数
let params = ctx.get_route_params().await;
let text: String = ctx.get_route_param("text").await;

8. 性能压测结果

wrk 工具压测

命令:

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

QPS(请求每秒)结果:

排名框架/运行时QPS
1Tokio340130.92
2Hyperlane324323.71
3Rocket298945.31
4Rust stdlib291218.96
5Gin242570.16
6Go stdlib234178.93
7Node stdlib139412.13

ab 工具压测

命令:

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

QPS 结果:

排名框架/运行时QPS
1Tokio308596.26
2Hyperlane307568.90
3Rocket267931.52
4Rust stdlib260514.56
5Go stdlib226550.34
6Gin224296.16
7Node stdlib85357.18

hyperlane 在高并发下表现优异,接近 Tokio 的底层性能,明显优于多数其他框架。


总结

hyperlane 以其灵活的 ctx 调用封装、丰富的请求方法宏、完善的响应接口、多版本生命周期支持及强大的路由能力,为 Rust Web 开发提供了现代化且高性能的解决方案。结合其业界领先的性能表现,是构建高效、可扩展 HTTP 服务的理想框架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…

一个小小的 flask app, 几个小工具,拼凑一下

1. 起因&#xff0c; 目的: 自己的工具&#xff0c;为自己服务。给大家做参考。项目地址&#xff1a; https://github.com/buxuele/flask_utils 2. 先看效果 3. 过程: 一个有趣的 Flask 工具集&#xff1a;从无到有的开发历程 缘起&#xff1a;为什么要做这个项目&#xff…

织梦dedecms怎样用标签调用随机数?

​在使用织梦模板建站中&#xff0c;随机数作为一个偶尔使用到的参数&#xff0c;在具体使用中虽然用的少&#xff0c;但是今天跟版网小编给大家介绍下&#xff0c;大家可以参考下&#xff1a; 实现随机数的调用可以使用下面的js&#xff1a; 方法一&#xff1a;js代码 Math…

访问服务器项目,服务器可以ping通,但是端口访问不到

原因&#xff1a;端口未开放 假设项目部署服务器为205&#xff0c;在90服务器访问205项目 1、首先在205确定项目启动&#xff0c;看端口是否占用 # Windows&#xff08;检查端口占用&#xff09; netstat -ano | findstr "8103"期望输出&#xff1a; TCP 0.0.…

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…

华为云Flexus+DeepSeek征文 | 基于ModelArts Studio、DeepSeek大模型和Dify搭建网站智能客服助手

目录 一、前言 二、ModelArts Studio&#xff08;MaaS&#xff09;介绍与应用场景 2.1ModelArts Studio&#xff08;MaaS&#xff09;介绍 2.2 ModelArts Studio&#xff08;MaaS&#xff09;使用场景 2.3 开通MaaS服务 2.4 开通DeepSeek-V3商用服务 三、华为云Flexus简介 3.1 …

『uniapp』url拦截屏蔽 避免webview中打开淘宝店铺自动跳转淘宝

目录 分析1. wv.overrideUrlLoading2. 参数 `mode: allow`3. 参数 `match: ^(http|https)://.*`4. 回调函数 `function(e) { console.warn(allow url:, e.url); }`作用:可能的应用场景:核心代码总结欢迎关注 『uniapp』 专栏,持续更新中 欢迎关注 『uniapp』 专栏,持续更新…

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…

Zookeeper 和 Kafka 版本与 JDK 要求

Apache Zookeeper 和 Apache Kafka 在不同版本中对 JDK 的要求如下表所示(基于官方文档和历史版本记录整理): 1. Zookeeper 版本与 JDK 要求 Zookeeper 版本要求的最低 JDK 版本说明3.4.x 系列JDK 6生产环境建议用 JDK 8(旧版兼容性强)。3.5.x 系列(3.5.5+)JDK 83.5.0 …

V837s-SDK Telnetd服务连接不上异常解决

目录 前言 一、检查 Telnetd 服务是否启动 二、问题解决 总结 前言 在基于 V837s-SDK 进行开发的过程中,Telnetd 服务连接不上是一个较为常见且棘手的问题。Telnet 作为一种远程登录协议,在开发调试时为我们提供了便捷的远程操作方式。若其连接出现异常,将严重影响开发进度…

滑动窗口最大值和最小值

题目&#xff1a; 思路&#xff1a; 窗口进行滑动时&#xff0c;需要快速获取min和max&#xff0c;因此需要一个结构来保存最值&#xff0c;而不是临时计算。动态的最值更新容易联想到单调栈&#xff0c;但是这里需要频繁增删元素&#xff0c;因此用双端队列&#xff0c;front…

JVM——对象创建全家桶:JVM中对象创建的模式及最佳实践

引入 在 Java 应用开发中&#xff0c;对象创建是最基础且高频的操作&#xff0c;但往往也是性能优化的关键切入点。想象一个在线阅读平台&#xff0c;每天需要创建数百万个 Book 对象来统计阅读数据。如果每个对象的创建过程存在内存浪费或性能瓶颈&#xff0c;累积效应将导致…

VSCode中PHP使用Xdebug

本地环境 windows10php8.2 ntsxdebug v3thinkphp v8 下载Xdebug Xdebug下载地址 从xdebug下载地址,下载最新的xdebug,解压后将php_xdebug.dll放入php目录的ext目录下 配置php.ini [Xdebug] zend_extension php_xdebug xdebug.client_host 127.0.0.1 xdebug.client_port…

金融系统渗透测试

金融系统渗透测试是保障金融机构网络安全的核心环节&#xff0c;它的核心目标是通过模拟攻击手段主动发现系统漏洞&#xff0c;防范数据泄露、资金盗取等重大风险。 一、金融系统渗透测试的核心框架 合规性驱动 需严格遵循《网络安全法》《数据安全法》及金融行业监管要求&am…

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…

PHP 项目中新增定时任务类型的详细步骤(以 CRMEB 为例)

1.首先需要在下面文件中增加定时任务类型 2.在app\services\system\crontab\CrontabRunServices类中增加第一步中与定时任务类型同名的方法&#xff0c;注意需要下划线转小驼峰 例如定时任务的类型为&#xff1a;order_tick,而在CrontabRunServices类中的方法名称为&#xff1…

Day27 函数专题2:装饰器

1.装饰器的思想&#xff1a;进一步复用 装饰器&#xff08;Decorator&#xff09;是 Python 中一种强大的编程工具&#xff0c;核心作用是在不修改原函数代码的前提下&#xff0c;为函数添加额外功能&#xff08;如日志记录、性能统计、权限校验等&#xff09;。它充分利用了 …

Qt进阶开发:动画框架的介绍和使用

文章目录 一、QPropertyAnimation 简介二、基本用法三、常用属性和方法四、支持的属性&#xff08;部分常用&#xff09;五、多个动画组合六、使用缓和曲线七、状态机框架 一、QPropertyAnimation 简介 #include <QPropertyAnimation>QPropertyAnimation 可以让你在一段…

IP选择注意事项

IP选择注意事项 MTP、FTP、EFUSE、EMEMORY选择时&#xff0c;需要考虑以下参数&#xff0c;然后确定后选择IP。 容量工作电压范围温度范围擦除、烧写速度/耗时读取所有bit的时间待机功耗擦写、烧写功耗面积所需要的mask layer