首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Dubbox 源碼深度解析(一):服務提供方與消費方啟動初始化全流程

     編輯:Java 綜合教學

Dubbox 源碼深度解析(一):服務提供方與消費方啟動初始化全流程

Dubbox(Dubbo 改進版)作為高性能 RPC 框架,其啟動初始化過程涉及容器啟動、Spring 集成、配置解析、註冊中心連接、協議服務暴露/引用等核心環節。本文梳理 Provider 和 Consumer 兩條主線的完整調用鏈。

一、服務提供方啟動流程

1. 容器啟動

com.alibaba.dubbo.container.Main.main(args)
→ 讀取 dubbo.properties → dubbo.container
→ container.start() → 支持 spring, log4j, jetty 等容器

2. Spring 容器加載配置

SpringContainer.java
→ 掃描 classpath*:META-INF/spring/*.xml
→ 解析 dubbo.xsd 自定義標簽

3. Bean 初始化: 解析

DubboNamespaceHandler.java
→ new DubboBeanDefinitionParser(ServiceBean.class, true)
→ Spring 對 Bean 進行初始化

4. ServiceBean 核心初始化鏈

ServiceBean.afterPropertiesSet()
→ setProvider(), setApplication(), setModule()
→ setRegistries(), setMonitor(), setProtocols(), setPath()
→ export()

5. 服務暴露核心邏輯

ServiceConfig.export()
→ doExportUrlsFor1Protocol()
→ protocol.export()  // 關鍵分發點

6. 協議自適應擴展機制

protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension()
// → Protocol$Adaptive.java (動態生成)
→ ExtensionLoader.loadExtensionClasses()
→ 掃描 META-INF/dubbo/internal/, META-INF/dubbo/, META-INF/services/
→ 讀取配置文件 com.alibaba.dubbo.rpc.Protocol
→ 裝配 filter、listener、mock 等 Wrapper

7. 註冊中心連接與註冊

RegistryProtocol.export()
→ getRegistry() → ZookeeperRegistry → ZookeeperClient
→ registry.subscribe()  // 加入監聽列表,接收配置變更通知

8. 協議服務器啟動(以 REST 為例)

RestProtocol.export()
→ doExport()
→ server.start(), server.deploy()  // 啟動嵌入式服務器

二、服務消費方啟動流程

1. 容器啟動

同 Provider,共用容器機制。

2. Bean 初始化: 解析

DubboNamespaceHandler.java
→ new DubboBeanDefinitionParser(ReferenceBean.class, false)

3. ReferenceBean 核心初始化

ReferenceBean.afterPropertiesSet()
→ ReferenceConfig.init()
→ createProxy()
→ refProtocol.refer()

4. 代理生成與協議引用

refProtocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension()
// 同 Provider 擴展加載機制
→ RegistryProtocol.refer()
→ getRegistry() → ZookeeperRegistry
→ doRefer()
→ RegistryDirectory.subscribe()
→ registry.subscribe()  // 監聽服務變更

5. 服務接口代理初始化

ReferenceConfig.init()
→ createProxy()
→ AbstractProxyFactory.getProxy()
→ JavassistProxyFactory.getProxy()
// 運行時生成 com.alibaba.dubbo.common.bytecode.Proxy 實例

三、核心設計模式總結

模式應用場景關鍵類
適配器/WrapperProtocol 擴展鏈:filter、listener、mock 層層包裹Protocol$Adaptive
工廠/擴展加載ExtensionLoader 動態掃描 @Adaptive 和配置文件ExtensionLoader
代理Consumer 端生成服務接口代理,透明遠程調用JavassistProxyFactory
觀察者註冊中心變更通知、配置動態刷新RegistryDirectory、NotifyListener
Copy-on-WriteURL 參數設置返回新對象,保證不可變性URL.putParameter()

四、關鍵收獲

  1. 動態擴展機制:通過 ExtensionLoader 掃描配置文件和 @Adaptive 註解,實現 Filter/Listener/Mock 的熱插拔
  2. URL 不可變設計:putParameter() 返回新對象,線程安全,避免併發修改問題
  3. 代理透明化:Consumer 無感知遠程調用,協議可插拔
  4. 觀察者無處不在:註冊中心訂閱、配置中心監聽、元數據變更通知

五、待深入細節(後續文章覆蓋)

  • 重試機制與容錯策略
  • 重要類結構圖譜(Invoker、Exporter、Directory、Router)
  • 序列化體系與線程模型
  • 服務治理:路由、負載均衡、熔斷降級

源碼閱讀建議:從 ExtensionLoader 入手理解擴展機制,再追蹤 Protocol$Adaptive 看協議分發,最後深入 RegistryProtocol 看註冊發現邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved