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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84462.shtml
英文地址,請注明出處:http://en.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