Dubbo 詳解
一、Dubbo 是什么
官網與定義
Dubbo 是一款高性能、輕量級的開源服務框架,其官網為 double.apache.org,提供中文版本(網址含 “zh”)。
核心能力
Dubbo 具備六大核心能力:
- 面向接口代理的高性能 RPC 調用 :RPC(Remote Procedure Call)即遠程過程調用,允許一個服務請求另一個遠程服務的能力,是 Dubbo 的核心。Dubbo 通過高性能 RPC 調用,實現服務間通信,通信協議可指定,默認用 Dubbo 協議,而非 HTTP。
- 智能容錯和負載均衡 :針對調用而言,保障系統穩定性和高可用性。
- 服務自動注冊與發現 :簡化服務管理,方便服務提供方和消費方動態發現和調用服務。
- 高度可擴展能力 :滿足不同業務場景需求。
- 運行流量調度 :優化服務調用過程中的流量分配。
- 可視化的服務治理與運維 :提升運維效率和管理水平。
這些能力均圍繞 RPC 調用進行擴展或輔助,因此 Dubbo 的核心在于服務間的 RPC 調用,在多服務場景下,服務相互調用可考慮使用 Dubbo。
發展情況
Dubbo 最初由阿里巴巴內部開發,后捐贈給 Apache,期間經歷維護中斷,一些公司基于其自行維護衍生品,如當當的 Dubbo X。如今,Dubbo 支持多種語言,應用廣泛,涵蓋互聯網公司(考拉、去哪兒等)和非互聯網公司(中國電信、中國人壽等)。
二、RPC 介紹
概念及發展歷程
RPC(遠程過程調用)是服務間通信的一種方式。早期程序主要是內部方法調用,隨著發展,出現同一臺電腦內多個進程間調用需求,即進程間通信。進一步地,當需要調用的能力不在同一臺電腦內時,便引入了 RPC(Remote Procedure Call)的概念。RPC 框架能方便實現遠程調用,如 Dubbo,使得其他計算機或程序提供的服務被本地程序利用,加強系統間協作。
常見框架及對比
常見的 RPC 框架有:
- 阿里 Dubbo 框架 :性能好,目前較為主流。
- 新浪魔毯框架 :架構簡單,適合初學者學習原理及源碼,或作為開發小型 RPC 框架的參考。
- Facebook Thrift 框架 :可伸縮跨語言框架,有強大代碼生成引擎,支持多種語言,適用于跨語言通信場景。
選擇框架需根據業務需求權衡,如團隊技術棧統一且對性能要求高,可選 Dubbo;若需跨語言通信,Thrift 是不錯選擇;技術棧不統一時,HTTP 可能更合適。
HTTP 和 RPC 對比
對比 Dubbo 通信協議與 HTTP 協議:
- 傳輸效率 :RPC 通常更高,因其協議無過多無用報文內容,無需轉 json。
- 通用性 :HTTP 更強,幾乎被所有公司默認支持,聯調首選;RPC 框架間兼容性差。
- 負載均衡 :RPC 框架自帶負載均衡策略,HTTP 需額外處理。
開發選擇建議依據團隊技術棧、語言需求及性能要求等因素綜合考量。
三、Dubbo 工作原理
模塊信息及架構
Dubbo 架構涉及以下模塊:
- provider :服務提供方,如商品服務提供查詢商品詳情能力。
- consumer :服務消費方,調用遠程服務獲取所需能力。
- registry :注冊中心,用于服務注冊與發現。
- monitor :監控中心,監控調用次數、時間等數據。
- container :服務運行時容器。
工作流程如下:
- 啟動 container,provider 在其中運行并向注冊中心注冊。
- consumer 訂閱服務信息,注冊中心將地址提供給 consumer。
- consumer 獲取信息后,直接調用對應 provider。
- consumer 和 provider 定期向 monitor 上報數據。
圖中紫色虛線表示初始化過程,藍色線(實線為同步調用,虛線為異步操作如通知和數據上報)表示其他操作。
四、項目開發流程
項目創建與配置
- 引入依賴 :在項目中引入 Dubbo 相關依賴,添加 Dubbo 特有的 @Service 注解。
- 指定注冊中心 :整合 Dubbo 時,通常選 Zookeeper 作為注冊中心,配置其地址以便 Dubbo 找到服務。
- 項目結構 :采用 spring cloud 課程結構,包含服務提供者(如課程列表)和服務調用者(如課程價格服務)兩個模塊,相互配合完成項目。
生產者開發
- 創建模塊 :在 Idea 中新建 Maven 項目,刪除原有 src 模塊,新建子模塊(如 producer),建立依賴關系。
- 編寫代碼 :在 producer 中創建包(如 com.imook.producer),包含 service 包定義接口(如 CourseListService)和實現類(如 CourseListServiceImpl),實現具體業務邏輯,如從數據庫獲取課程并展示。編寫實體類(如 Course),繼承 Serializable 接口,包含主鍵 ID、課程 ID、名稱、是否上架等字段,引入 List 列表和 JAVA Util 工具類。
- 配置文件 :在 resources 新建 application.properties 配置文件,配置服務版本號、通信協議、端口號、注冊地址等信息,指定 Dubbo 服務位置(如通過 dubbo.scan.base-packages)。
消費者開發
- 配置依賴 :消費者依賴配置與生產者基本一致,可復制生產者依賴配置并修改名稱。
- 配置文件 :復制生產者配置文件,修改端口號(如 8084)和項目名稱(如 course price)。
- 編寫業務邏輯 :新建包(如 com.imook.consumer),復制 entity 和 dao 包,新建 service 包定義接口(如課程價格服務接口,含通過 ID 查找價格、獲取課程列表并匹配價格等方法)及實現類(如 CoursePriceServiceImpl),在實現類中通過 @Reference 注解引入 Dubbo 服務,實現具體邏輯,如調用 Mapper 查詢價格、獲取課程列表并遍歷匹配價格等。
- 控制器與啟動類 :創建控制器,引入 service,實現具體功能如獲取課程價格、課程名稱和價格列表等。構建 Spring Boot 啟動類,更換注解為 @SpringBootApplication 以對外暴露服務,并確保正確配置 Dubbo 相關內容。
注意事項
- ZooKeeper 啟動 :消費者啟動前必須確保 ZooKeeper 已啟動,否則消費者找不到依賴服務會報錯。
- 啟動順序 :生產者需先于消費者啟動,讓消費者能正常找到所依賴的服務,可通過配置關閉此檢查。
- 注解選擇 :區分 spring framework 和 Apache Dubbo 的庫,正確選擇 Dubbo 的 @Service 和 @Reference 注解,并指定版本,避免沖突。
- 配置細節 :生產者要正確配置協議、端口號、注冊地址等信息,實體類需考慮駝峰配置,以確保下劃線字段自動轉換。