作者:楊欣(海星),Apache Dubbo Committer,前阿里巴巴高階技術專家
在 Apache Dubbo 3.3.0 版本之後,官方推出了全新升級的 Triple X 協議,全面支援 HTTP/1、HTTP/2 和 HTTP/3 協議。本文將圍繞 Triple 協議對 HTTP/3 的支援進行詳細闡述,包括其設計目標、實際應用案例、效能測試結果以及原始碼架構分析等內容。
Triple X 協議簡介
在 Dubbo 的早期應用中,雖然其在資料中心內部的服務互通中展現了卓越的效能,但隨著技術演進和應用場景的擴充套件,原有架構逐漸暴露出了一些瓶頸。這些瓶頸在跨區域、跨雲的環境中尤為明顯,尤其是在 Web 框架與 RPC 框架之間的頻繁切換中,開發複雜性和系統效能都受到了影響。
傳統架構的痛點主要體現在:
- 侷限於資料中心內的應用場景: 在跨地域或跨雲應用中,Dubbo 的傳統架構缺乏對廣域環境的原生支援,導致開發者需要在多種協議和框架中切換,增加了複雜性。
- 南北向與東西向流量的雙重挑戰: 在現代微服務架構下,傳統的 RPC 框架往往更側重南北向流量最佳化,而服務間(東西向)通訊的效能要求日益增加,對傳統 Dubbo 架構提出了新的挑戰。
- 雲原生與跨語言互操作性要求: 隨著雲原生技術的普及,系統需要對 HTTP 協議有更深層次的支援,並具備跨語言的通訊能力,然而傳統 Dubbo 在這一點上並未原生最佳化。
Triple X 的變革和突破: Triple X 的誕生,直接回應了這些痛點,它不僅延續了 Dubbo 一貫的高效能通訊能力,還實現了與 gRPC 協議的全面相容,透過支援 HTTP/1、HTTP/2、HTTP/3 等協議,為跨雲、跨區域的廣泛應用場景提供了更具靈活性和高效性的解決方案。
HTTP/3:為現代網路通訊注入新動力
HTTP/3 是一種全新的超文字傳輸協議版本,旨在提升現代網路的速度、安全性和可靠性。它基於 Google 的 QUIC 協議構建,使用 UDP 而非傳統的 TCP 進行資料傳輸,從根本上解決了 HTTP/2 中的部分效能瓶頸。基於 HTTP/3 構建 RPC(遠端過程呼叫)協議具有顯著的技術優勢。
- 首先,HTTP/3 的低延遲特性和快速連線建立機制能夠顯著縮短 RPC 呼叫的響應時間,尤其是在行動網路或跨地域呼叫場景中表現尤為突出。
- 其次,HTTP/3 的多路複用特性允許多個 RPC 請求共用一個連線而不會因單個請求的阻塞影響其他請求,從而提升併發能力和傳輸效率。
- 此外,內建的 TLS 1.3 加密機制確保了資料傳輸的安全性,簡化了應用層的安全配置。
- 更重要的是,HTTP/3 對網路丟包的敏感處理,使得 RPC 呼叫在複雜網路環境中仍然能夠保持穩定的效能表現。
這些特性使得基於 HTTP/3 的 RPC 協議在高效能和高可靠性應用場景中具有天然優勢。
Triple X 正式支援 HTTP/3
Triple 協議實現了對 HTTP/3 協議的支援,RPC 請求和 REST 請求均可透過 HTTP/3 協議傳輸,Triple 使用 HTTP/3 後在以下方面的表現得到了顯著提升:
- 提升效能: 支援 HTTP/3 後,利用 QUIC 協議降低延遲,加快請求響應速度,特別是在高延遲或複雜網路環境中,能夠顯著提升服務的整體效能。
- 增強可靠性: HTTP/3 透過多路複用和連線遷移避免隊頭阻塞,即使在網路狀況不佳時,也能保持連線的穩定性,確保服務的可靠交付。
- 提高安全性: HTTP/3 強制要求 TLS1.3 加密,相比傳統HTTP/2 可選加密,提供了更安全的通訊保障。
- 適應弱網路環境: 在高丟包率或頻寬不穩定的情況下,HTTP/3 能夠維持較高地連線質量和服務效能,提升在弱網路環境中的效能。
由於 HTTP/3 基於 QUIC 協議(UDP),可能會被防火牆或閘道器阻止。因此,triple 實現了 HTTP/3 協商能力並預設啟用。連線首先透過 HTTP/2 建立,如果成功且服務端返回表示支援 HTTP/3 的 Alt-Svc [ 1] 頭,客戶端將自動切換到 HTTP/3。
實踐案例:為應用開啟 HTTP/3 通訊
透過本小節,您可以學習如何為一個普通的 Dubbo 應用開啟 HTTP/3 通訊支援,首先需要確保您使用的是 Triple RPC 協議,只需要增加以下配置即可開啟 HTTP/3 特性。
在 dubbo-samples 開源倉庫的 2-advanced/dubbo-samples-triple-http3 目錄中有一個完整的示例可供深入學習。
配置開啟 HTTP/3 傳輸支援
dubbo:
protocol:
name: tri
triple:
http3:
enabled: true
新增 HTTP/3 協議解析依賴包
<dependencys>
<dependency>
<groupId>io.netty.incubator</groupId>
<artifactId>netty-incubator-codec-http3</artifactId>
<version>0.0.28.Final</version>
</dependency>
<!-- To support self-signed certificates, if the certificate is configured that does not require -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.70</version>
</dependency>
</dependencys>
執行示例並測試效果
如果您基於上文中的示例原始碼倉庫下載了完整的示例原始碼,在完成以上兩部配置修改之後則可以直接啟動示例,此時示例通訊就是基於 HTTP/3 的。
示例成功啟動後,可執行 Curl 命令測試。
請注意,curl 需要升級到支援 HTTP/3 的新版本,參見:https://curl.se/docs/http3.html**
curl --http3 -vk 'https://localhost:50052/org.apache.dubbo.demo.GreeterService/sayHelloAsync?request=world'
# 輸出如下
#* QUIC cipher selection: TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256
#* Skipped certificate verification
#* using HTTP/3
#* [HTTP/3] [0] OPENED stream for https://localhost:50052/org.apache.dubbo.demo.GreeterService/sayHelloAsync?request=world
#* [HTTP/3] [0] [:method: GET]
#* [HTTP/3] [0] [:scheme: https]
#* [HTTP/3] [0] [:authority: localhost:50052]
#* [HTTP/3] [0] [:path: /org.apache.dubbo.demo.GreeterService/sayHelloAsync?request=world]
#>
#* Request completely sent off
#< HTTP/3 200
#< content-type: application/json
#<
#"Hello world"
效能對比:弱網通訊效率提升 6 倍
Apache Dubbo 在其全新的 Triple 協議中引入了對 HTTP/3 的支援,顯著改善了跨雲、跨地域和弱網路環境中的通訊效能。例如,透過 QUIC 協議降低延遲,Dubbo 在弱網路條件下的效率提升了 6 倍。Triple 協議相容 HTTP/1、HTTP/2 和 HTTP/3,使得開發者可以靈活應對不同場景需求,同時簡化了系統架構。透過這些創新,Dubbo 進一步強化了在高效能分散式服務中的領先地位。
丟包率對 QPS 的影響
丟包率對 RT 的影響
原始碼解析:Dubbo HTTP/3 實現架構圖
以下是 Triple X 協議支援 HTTP/1、HTTP/2、HTTP/3 的架構圖,感興趣的開發者可對照原始碼深入學習。
總結
HTTP/3 的引入和應用為網路通訊帶來了顯著的技術進步。作為現代網路的核心協議之一,HTTP/3 透過基於 QUIC 的設計,解決了以往協議在高延遲、弱網路等複雜環境中的效能瓶頸。尤其是在 RPC 協議的構建中,HTTP/3 的低延遲、多路複用、丟包敏感處理和強制加密等特性,顯著提升了通訊的效率、安全性和可靠性。
以 Apache Dubbo 的 Triple 協議為例,基於 HTTP/3 的架構不僅擴充套件了跨雲、跨區域的應用場景,還在弱網環境下實現了高達 6 倍的效能提升。透過靈活適配不同協議,Dubbo 提供了更加高效且安全的分散式服務解決方案,為現代微服務架構的進一步發展奠定了基礎。
相關連結:
[1] Alt-Svc
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Alt-Svc