天天看點

Dubbo 3 深度剖析 - 透過源碼認識你|高清網盤XZ

Apache Dubbo 是一款高性能、輕量級的開源服務架構,Apache Dubbo 3.0.0 正式釋出 - 全面擁抱雲原生

自從 Apache Dubbo 在 2011 年開源以來,在一衆大規模網際網路、IT 公司的實踐中積累了大量經驗後,Dubbo 憑借對 Java 使用者友好、功能豐富、治理能力強等優點在過去取得了很大的成功,成為國内外熱門主流的 RPC 架構之一。

但随着雲原生時代的到來,以 Apache Dubbo、Spring Cloud 等為代表的 Java 微服務治理體系面臨了許多新的需求,包括期望應用可以更快的啟動、應用通信的協定穿透性可以更高、能夠對多語言的支援更加友好等。例如 Spring 也在今年推出了其基于 GraalVM 的 Spring Native Beta 解決方案,擁有毫秒級啟動的能力、更高的處理性能等優化提升。

這樣的背景對下一代 Apache Dubbo 提出了兩大要求:一是要保留已有的開箱即用和落地實踐背景下積累的優點,這也是衆多開發者所期望的;二是盡可能地遵循雲原生思想,能更好的複用底層雲原生基礎設施并且更貼合雲原生的微服務架構。

Apache Dubbo3 相比 2.7 版本進行了全面的更新,以下是新增的一些核心特性:

全新服務發現模型

相比于 2.x 版本中的基于接口粒度的服務發現機制,3.x 引入了全新的基于應用粒度的服務發現機制, 新模型帶來兩方面的巨大優勢:

進一步提升了 Dubbo3 在大規模叢集實踐中的性能與穩定性。新模型可大幅提高系統資源使用率,降低 Dubbo 位址的單機記憶體消耗(50%),降低注冊中心叢集的存儲與推送壓力(90%), Dubbo 可支援叢集規模步入百萬執行個體層次。

打通與其他異構微服務體系的位址互發現障礙。新模型使得 Dubbo3 能實作與異構微服務體系如Spring Cloud、Kubernetes Service、gRPC 等,在位址發現層面的互通, 為連通 Dubbo 與其他微服務體系提供可行方案。

在 Dubbo3 前期版本将會同時提供對兩套位址發現模型的支援,以最大程度保證業務更新的相容性。

下一代 RPC 通信協定

定義了全新的 RPC 通信協定 – Triple,一句話概括 Triple:它是基于 HTTP/2 上建構的 RPC 協定,完全相容 gRPC,并在此基礎上擴充出了更豐富的語義。 使用 Triple 協定,使用者将獲得以下能力

更容易到适配網關、Mesh架構,Triple 協定讓 Dubbo 更友善的與各種網關、Sidecar 元件配合工作。

多語言友好,推薦配合 Protobuf 使用 Triple 協定,使用 IDL 定義服務,使用 Protobuf 編碼業務資料。

流式通信支援。Triple 協定支援 Request Stream、Response Stream、Bi-direction Stream

雲原生

Dubbo3 建構的業務應用可直接部署在 VM、Container、Kubernetes 等平台,Dubbo3 很好的解決了 Dubbo 服務與排程平台之間的生命周期對齊,Dubbo 服務發現位址 與容器平台綁定的問題。

在服務發現層面,Dubbo3 支援與 Kubernetes Native Service 的融合,目前限于 Headless Service。

Dubbo3 規劃了兩種形态的 Service Mesh 方案,在不同的業務場景、不同的遷移階段、不同的基礎設施保障情況下,Dubbo 都會有 Mesh 方案可供選擇, 而這進一步的都可以通過統一的控制面進行治理。

經典的基于 Sidecar 的 Service Mesh

無 Sidecar 的 Proxyless Mesh

使用者在 Dubbo2 中熟知的路由規則,在 3.x 中将被一套統一的流量治理規則取代,這套統一流量規則将覆寫未來 Dubbo3 的 Service Mesh、SDK 等多種部署形态, 實作對整套微服務體系的治理。

擴充點分離

Dubbo3 的 maven 也發生了一些變化,org.apache.dubbo:dubbo:3.0.0 将不再是包含所有資源的 all-in-one 包,一些可選的依賴已經作為獨立元件單獨釋出, 是以如果使用者使用了不在 dubbo 核心依賴包中的獨立元件,如 registry-etcd、rpc-hessian 等,需要為這些元件在 pom.xml 中單獨增加依賴包。

Zookeeper 擴充實作仍在核心依賴包中,依賴保持不變

Redis 擴充實作已經不在核心依賴包中,如啟用了 Redis 相關功能,需單獨增加依賴包

服務柔性

Dubbo3.0 的柔性增強以面向失敗設計為理念,提供包括精準容量評估、自适應限流、自适應負載均衡的支援,自底向上的分步建構大規模可靠應用。 從單一服務的視角看,服務是壓不垮的,穩定的。從分布式視角看,複雜的拓撲不會帶來性能的下降,分布式負載均衡能夠以最優的方式動态配置設定流量,保證異構系統能夠根據運作時的準确服務容量合理配置設定請求,進而達到性能最優

全面的性能提升

對比 2.x 版本,Dubbo3 版本

服務發現資源使用率顯著提升。

對比接口級服務發現,單機常駐記憶體下降 50%,位址變更期 GC 消耗下降一個數量級 (百次 -> 十次)

對比應用級服務發現,單機常駐記憶體下降 75%,GC 次數趨零

Dubbo 協定性能持平,Triple 協定在網關、Stream吞吐量方面更具優勢。

Dubbo協定 (3.0 vs 2.x),3.0 實作較 2.x 總體 qps rt 持平,略有提升

Triple協定 vs Dubbo協定,直連調用場景 Triple 性能并無優勢,其優勢在網關、Stream調用場景。

服務提供者

建立一個空工程,并建立maven工程(打包方式為war)dubbodemo_provider子產品,在pom.xml檔案中導入如下坐标

第二步、編寫spring與dubbo整合的服務提供者spring配置檔案applicationContext-dubboprovider.xml

第三步、在web.xml中配置項目加載監聽器,并指定spring配置檔案的路徑

第四步、編寫service的接口和實作類

Service接口代碼