
🤖 VOLO簡介
Volo 是由字節跳動服務框架團隊開源的一款高性能、易用的 Rust RPC 框架。
Volo 框架自身開銷極低,并提供了命令行工具與靈活的中間件設計,讓開發者可以輕松上手,享受 Rust 帶來的開發樂趣。
本文介紹自 Volo-HTTP 0.3.0 版本以來的變更。
🚀 功能亮點
1.客戶端易用性提升
此前的應用中,為了追求性能,我們在 Client
中使用了大量泛型,這導致其類型定義異常復雜,相關的錯誤信息也令人費解,增加了開發者的理解成本。
為了解決這個問題,我們在新版本中對 Client
的封裝方式進行了優化,通過在最外層使用 Box
來包裝內部的 dyn Future
。這一改動在確保類型簡潔易用的同時,幾乎不會引入額外的性能開銷。
具體對比如下:
舊版本 (0.3.0): 用戶需要構建一個帶有復雜泛型類型的 DefaultClient
。新版本 (0.4.0): 用戶可以直接使用 Client
,類型更清晰,使用更簡單。
2.支持HTTP/2
新版本現已為服務端和客戶端提供了完整的 HTTP/2 支持,并且客戶端也已支持連接池功能。
🔧其他變更
1.刪除客戶端的默認Target
考慮到客戶端的默認Target
使用頻率不高,但卻使Target
的選擇邏輯過于復雜,我們在此版本中移除了它。
不過,我們添加了TargetLayer
,可以強制Client
設置Target
,這樣可以提供與以前類似的體驗。
隨著默認 Target
的移除,默認Host
的配置也被一并移除。我們重構了原有的Host
Layer,使其更加靈活,現在支持None
,Auto
,Force
,Fallback
四種模式。默認的 callee name
已被移除,推薦使用TargetLayer
的with_callee_name
方法來代替。該方法主要用于通過 IP 地址訪問 HTTPS 服務,并需要設置 SNI(服務器名稱指示)的場景。RequestBuilder::full_uri
已被移除。我們推薦通過Layer
的方式來實現該功能,而非直接在RequestBuilder
中操作。相關示例將稍后發布。
2.其他優化與調整
命名統一: DefaultLB
和DefaultLBService
已重命名為DefaultLb
和DefaultLbService
。廢棄項移除: 移除了已廢棄的 ClientRequest
,ServerRequest
,ClientResponse
,ServerResponse
類型。代碼簡化: 減少了部分不必要的泛型約束。 日志修復: 修復了當 discover
的watch channel
關閉時,會無限循環打印警告日志的問題。新增代理支持: 新增 HttpProxyLayer
,以支持 RFC7230 中定義的 HTTP 代理。可觀測性: HTTP 服務端現已支持 SpanProvider
。
🐞Bug修復
現在使用 DiscoverKey
作為Discover::Key
,替代了原先的(FastStr, u16)
元組。這解決了因域名帶有端口,而導致的意外緩存問題。
重大變更
1.簡化客戶端
以下復雜的類型別名已被徹底移除: ClientMetaService
ClientService
SimpleClient
DefaultClientOuterService
DefaultClient
Client
的泛型類型已從內部服務 (S
) 調整為請求體和響應體 (ReqBody
和RespBody
)。在絕大多數場景下,用戶可以直接使用Client
而無需關心其泛型類型。
2.支持 HTTP/2
為支持 HTTP/2,我們引入了新的 Cargo features: "http1"
和"http2"
。默認 features 已更新為 ["default-client", "default-server"]
。請注意, "default-client"
和"default-server"
僅啟用 HTTP/1。
3.移除客戶端的默認Target
以下與默認 Target
相關的函數已從ClientBuilder
中移除:ClientBuilder::address
ClientBuilder::host
ClientBuilder::with_port
ClientBuilder::with_scheme
ClientBuilder::target_ref
ClientBuilder::target_mut
Host
Layer 已被重構,ClientBuilder::default_host
已更新為ClientBuilder::host_mode
。RequestBuilder::full_uri
已被移除。
📄完整更新日志
volo-http-0.3.0...volo-http-0.4.0[1]
volo-http-0.3.0...volo-http-0.4.0: https://github.com/cloudwego/volo/compare/volo-http-0.3.0...volo-http-0.4.0