Dubbo Triple 協議重磅升級:支持通過 HTTP 連通 Web 與後端微服務

全新升級的 Triple 協議

在微服務協議選型方面我們看到越來越多的應用從 Dubbo2 TCP 二進制協議遷移到 Dubbo3 Triple 協議 (兼容 gRPC),以充分利用 Triple 的高效、全雙工、Streaming 流式通信模型等能力;Triple+HTTP/2 的組合很好的解決了後端服務穿透性等問題,但在阿里及衆多社區企業的實踐中,我們發現基於 Triple 構建的微服務對於前端設備接入成本仍然比較高,用戶需要通過網關協議轉換來接入 Triple 後端服務(類似之前 Dubbo2 泛化調用),對於開發測試、運維等成本都非常高。

基於以上背景,我們對 Dubbo3 中的 Triple 協議進行了全面升級:Triple 協議是 Dubbo3 設計的基於 HTTP 的 RPC 通信協議規範,它完全兼容 gRPC 協議,支持 Request-Response、Streaming 流式等通信模型,可同時運行在 HTTP/1 和 HTTP/2 之上。

你可以使用 cURL 等標準 HTTP 工具訪問 Triple 協議發佈的服務。

curl \
    --header "Content-Type: application/json" \
    --data '{"sentence": "Hello Dubbo."}' \
    https://host:port/org.apache.dubbo.sample.GreetService/sayHello

基於 Triple 協議,你可以輕鬆地構建 Dubbo 後端微服務體系,由於 Triple 面向 HTTP 協議的易用性設計,前端設備如 Web、Mobile、標準 HTTP 等可以更輕鬆的接入後端體系,同時,Triple 與 gRPC 協議完全兼容性可實現與 gRPC 體系的互通。

Dubbo 框架提供了 Triple 協議的多種語言實現,它們可以幫助你構建瀏覽器、gRPC 兼容的 HTTP API 接口:你只需要定義一個標準的 Protocol Buffer 格式的服務並實現業務邏輯,Dubbo 負責幫助生成語言相關的 Server Stub、Client Stub,並將整個調用流程無縫接入如路由、服務發現等 Dubbo 體系。針對某些語言版本,Dubbo 框架還提供了更貼合語言特性的編程模式,即不綁定 IDL 的服務定義與開發模式,比如在 Dubbo Java 中,你可以選擇使用 Java Interface 和 Pojo 類定義 Dubbo 服務,並將其發佈爲基於 Triple 協議通信的微服務。

協議設計目標與適用場景

基於 Triple 協議,你可以實現以下目標:

當 Dubbo 作爲 Client 時

Dubbo Client 可以訪問 Dubbo 服務端 (Server) 發佈的 Triple 協議服務,同時還可以訪問標準的 gRPC 服務端。

  • 調用標準 gRPC 服務端,發送 Content-type 爲標準 gRPC 類型的請求:application/grpc, application/grpc+proto, and application/grpc+json
  • 調用 Dubbo 服務端,發送 Content-type 爲 Triple 類型的請求:application/json, application/proto, application/triple+wrapper

當 Dubbo 作爲 Server 時

Dubbo Server 默認將同時發佈對普通 HTTP、gRPC 協議的支持,Triple 協議可以同時工作在 HTTP/1、HTTP/2 之上。因此,Dubbo Server 可以處理 Dubbo 客戶端發過來的 Triple 協議請求,可以處理標準的 gRPC 協議請求,還能處理 cURL、瀏覽器發送過來的 HTTP 請求。以 Content-type 區分就是:

  • 處理 gRPC 客戶端發送的 Content-type 爲標準 gRPC 類型的請求:application/grpc、application/grpc+proto、application/grpc+json
  • 處理 Dubbo 客戶端發送的 Content-type 爲 Triple 類型的請求:application/json、application/proto、application/grpc+wrapper
  • 處理 cURL、瀏覽器等發送的 Content-type 爲 Triple 類型的請求:application/json、application/proto、application/grpc+wrapper

示例場景

Triple 協議按照 gRPC Spec 原生全量支持 Content-Type: application/grpc 協議的通信。基於此模式,Triple Client 可以調用任意的 gRPC Server,反之亦然。

Triple 協議支持基於 json 這種通用格式,將任意服務暴露到外部,任何支持標準 HTTP 協議的客戶端(如 cURL、瀏覽器、終端)都可以直接發起調用,無需任何協議轉換。

Triple 支持將 Java 友好的 Hessian、Kryo 等序列化封裝在 HTTP 協議之上,從網絡層看來就是一個標準的 HTTP 協議報文,天然兼容任何支持 HTTP 協議的 WAF、Gateway 等,可以很好地複用當前網絡層的基礎設施。

協議規範(Specification)

請在此查看 Triple 協議規範詳情 Triple Specification[1]

與 gRPC 協議的關係詳解

上面提到 Triple 完全兼容 gRPC 協議,那既然 gRPC 官方已經提供了多語言的框架實現,爲什麼 Dubbo 還要通過 Triple 重新實現一遍那?核心目標主要有以下兩點:

  • 首先,在協議設計上,Dubbo 參考 gRPC 與 gRPC-Web 兩個協議設計了自定義的 Triple 協議:Triple 是一個基於 HTTP 傳輸層協議的 RPC 協議,它完全兼容 gRPC 的同時可運行在 HTTP/1、HTTP/2 之上。
  • 其次,Dubbo 框架在每個語言的實現過程中遵循了符合框架自身定位的設計理念,相比於 grpc-java、grpc-go 等框架庫,Dubbo 協議實現更簡單、更純粹,嘗試在實現上規避 gRPC 官方庫中存在的一系列問題。

gRPC 本身作爲 RPC 協議規範非常優秀,但原生的 gRPC 庫實現在實際使用存在一系列問題,包括實現複雜、綁定 IDL、難以調試等,Dubbo 在協議設計與實現上從實踐出發,很好的規避了這些問題:

  • 原生的 gRPC 實現受限於 HTTP/2 交互規範,無法爲瀏覽器、HTTP API 提供交互方式,你需要額外的代理組件如 grpc-web、grpc-gateway 等才能實現。在 Dubbo 中,你可以直接用 curl、瀏覽器訪問 Triple 協議服務。
  • gRPC 官方庫強制綁定 Protocol Buffers,唯一的開發選擇就是使用 IDL 定義和管理服務,這對於一些多語言訴求不強的用戶是一個非常大的使用負擔。Dubbo 則在支持 IDL 的同時,爲 Java、Go 等提供了語言特有的服務定義與開發方式。
  • 在開發階段,以 gRPC 協議發佈的服務非常難以調試,你只能使用 gRPC 特定的工具來進行,很多工具都比較簡陋 & 不成熟。而從 Dubbo3 開始,你可以直接使用 curl | jq 或者 Chrome 開發者工具來調試你的服務,直接傳入 JSON 結構體就能調用服務。
  • 首先,gRPC 協議庫有超過 10 萬行代碼的規模,但 Dubbo (Go、Java、Rust、Node.js 等) 關於協議實現部分僅有幾千行代碼,這讓代碼維護和問題排查變得更簡單。
  • 谷歌提供的 gRPC 實現庫沒有使用主流的第三方或語言官方協議庫,而是選擇自己維護了一套實現,讓整個維護與生態擴展變得更加複雜。比如 grpc-go 自己維護了一套 HTTP/2 庫而不是使用的 go 官方庫。Dubbo 使用了官方庫的同時,相比 gRPC 自行維護的 http 協議庫維持了同一性能水準。
  • gRPC 庫僅僅提供了 RPC 協議實現,需要你做很多額外工作爲其引入服務治理能力。而 Dubbo 本身是不綁定協議的微服務開發框架,內置 HTTP/2 協議實現可以與 Dubbo 服務治理能力更好的銜接在一起。

實現更簡單

Dubbo 框架實現專注在 Triple 協議自身,而對於底層的網絡通信、HTTP/2 協議解析等選擇依賴那些經過長期檢驗的網絡庫。比如 Dubbo Java 基於 Netty 構建,而 Dubbo Go 則是直接使用的 Go 官方 HTTP 庫。Dubbo 提供的 Triple 協議實現非常簡單,對應 Dubbo 中的 Protocol 組件實現,你可以僅僅花一下午時間就搞清楚 Dubbo 協議的代碼實現。

大規模生產環境檢驗

自 Dubbo3 發佈以來,Triple 協議已被廣泛應用於阿里巴巴以及衆多社區標杆企業,尤其是一些代理、網關互通場景。一方面 Triple 通過大規模生產實踐被證實可靠穩定,另一方面 Triple 的簡單、易於調試、不綁定 IDL 的設計也是其得到廣泛應用的重要因素。

原生多協議支持

當以 Dubbo 框架爲服務端對外發布服務時,可以做到在同一端口原生支持 Triple、gRPC 和 HTTP/1 協議,這意味着你可以用多種形式訪問 Dubbo 服務端發佈的服務,所有請求形式最終都會被轉發到相同的業務邏輯實現,這給你提供了更大的靈活性。Dubbo 完全兼容 gRPC 協議及相關特性包括 streaming、trailers、error details 等,你選擇直接在 Dubbo 框架中使用 Triple 協議(另外,你也可以選擇使用原生的 gRPC 協議),然後你就可以直接使用 Dubbo 客戶端、curl、瀏覽器等訪問你發佈的服務。在與 gRPC 生態互操作性方面,任何標準的 gRPC 客戶端,都可以正常訪問 Dubbo 服務;Dubbo 客戶端也可以調用任何標準的 gRPC 服務,這裏有提供的互操作性示例[2]以下是使用 cURL 客戶端訪問 Dubbo 服務端 Triple 協議服務的示例:

curl \
    --header "Content-Type: application/json" \
    --data '{"sentence": "Hello Dubbo."}' \
    https://host:port/org.apache.dubbo.sample.GreetService/sayHello

一站式服務治理接入

我們都知道 Dubbo 有豐富的微服務治理能力,比如服務發現、負載均衡、流量管控等,這也是我們使用 Dubbo 框架開發應用的優勢所在。要想在 Dubbo 體系下使用 gRPC 協議通信,有兩種方式可以實現,一種是直接在 Dubbo 框架中引入 gRPC 官方發佈的二進制包,另一種是在 Dubbo 內原生提供 gRPC 協議兼容的源碼實現。相比於第一種引入二進制依賴的方式,Dubbo 框架通過內置 Triple 協議實現的方式,原生支持了 gRPC 協議,這種方式的優勢在於源碼完全由自己掌控,因此協議的實現與 Dubbo 框架結合更爲緊密,能夠更靈活的接入 Dubbo 的服務治理體系。

多語言實現

基於 Triple 協議設計,我們計劃爲儘可能多的語言提供輕量的 RPC 協議實現,讓 Triple 協議互通可以完整的覆蓋多套語言棧,與 gRPC 兼容且具備更好的易用性。同時,Dubbo 會繼續在一些被廣泛用於微服務開發的語言(如Java、Go等)提供完善的微服務治理能力,讓 Dubbo 成爲一套可以連接前後端的微服務開發體系。

當前,Dubbo Java 語言已經在 3.3.0-triple-SNAPSHOT 版本完成了以上 Triple 協議升級的初步目標,具體可在 samples/dubbo-samples-triple-unary 示例中體驗(可點擊閱讀原文跳轉到示例鏈接)。Triple 協議同步推進中的多語言實現還包括:Go、Node.js、Rust 等後端實現,Javascript Web 端實現。

Java 語言

在 Dubbo Java 庫實現中,除了 IDL 方式外,你可以使用 Java Interface 方式定義服務,這對於衆多熟悉 Dubbo 體系的 Java 用戶來說,可以大大降低使用 gRPC 協議的成本。

另外,Java 版本的協議實現在性能上與 grpc-java 庫基本持平,甚至某些場景下比 grpc-java 性能表現還要出色。而這一切還是建立在 Dubbo 版本協議的實現複雜度遠小於 gRPC 版本的情況下,因爲 grpc-java 維護了一套定製版本的 HTTP/2 協議實現。

倉庫地址:https://github.com/apache/dubbo

Go 語言實現

Dubbo Go 推薦 IDL 開發模式,通過 Dubbo 配套的 protoc 插件生成 stub 代碼,你只需要提供對應的業務邏輯實現即可,你可以通過 curl、瀏覽器訪問 Dubbo Go 發佈的 gRPC 服務。倉庫地址:https://github.com/apache/dubbo-go/

Rust

Dubbo Rust 已經完整實現了 gRPC 協議兼容部分,目前正在推進 HTTP/1 等模式下的 unary RPC 調用支持。

倉庫地址:https://github.com/apache/dubbo-rust/

Node.js

Node.js 語言已經完整實現了 gRPC 協議兼容部分,目前正在推進 HTTP/1 等模式下的 unary RPC 調用支持。

倉庫地址:https://github.com/apache/dubbo-js/

Web

通過 Dubbo 提供的 Javascript 客戶端庫,讓你可以編寫運行在瀏覽器中的前端頁面,在瀏覽器側直接發起對後端 Dubbo 服務的請求調用。倉庫地址:https://github.com/apache/dubbo-js/

相關鏈接:

[1] Triple Specification

https://cn.dubbo.apache.org/zh-cn/overview/reference/protocols/triple-spec/

[2] 互操作性示例

https://github.com/apache/dubbo-samples/tree/triple-protocol-sample-0719/2-advanced/dubbo-samples-triple-grpc

作者:劉軍

點擊立即免費試用雲產品 開啓雲上實踐之旅!

原文鏈接

本文爲阿里雲原創內容,未經允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章