Dubbo源碼解析(一)服務發現

1、源碼模塊

官網地址html

源碼地址spring

1.1 源碼模塊組織

Dubbo工程是一個Maven多Module的項目,以包結構來組織各個模塊。apache

 

核心模塊及其關係,如圖所示:負載均衡

1.2 模說明

  • dubbo-common 公共邏輯模塊,包括Util類和通用模型。
  • dubbo-remoting 遠程通信模塊,至關於Dubbo協議的實現,若是RPC用RMI協議則不須要使用此包。
  • dubbo-rpc 遠程調用模塊,抽象各類協議,以及動態代理,只包含一對一的調用,不關心集羣的管理。
  • dubbo-cluster 集羣模塊,將多個服務提供方假裝爲一個提供方,包括:負載均衡、容錯、路由等,集羣的地址列表能夠是靜態配置的,也能夠是由註冊中心下發。
  • dubbo-registry 註冊中心模塊,基於註冊中心下發地址的集羣方式,以及對各類註冊中心的抽象。
  • dubbo-monitor 監控模塊,統計服務調用次數,調用時間的,調用鏈跟蹤的服務。
  • dubbo-config 配置模塊,是Dubbo對外的API,用戶經過Config使用Dubbo,隱藏Dubbo全部細節。
  • dubbo-container 容器模塊,是一個Standalone的容器,以簡單的Main類加載Spring啓動,由於服務一般不須要Tomcat/JBoss等Web容器的特性,不必用Web容器去加載服務。由於服務一般不須要 Tomcat/JBoss 等 Web 容器的特性,不必用 Web 容器去加載服務。

 

2、服務發現

Dubbo的應用會在啓動時完成服務註冊或訂閱(不管是生產者,仍是消費者)以下圖所示。異步

  • 圖中小方塊Protocol, Cluster, Proxy, Service, Container, Registry, Monitor表明層或模塊,藍色的表示與業務有交互,綠色的表示只對Dubbo內部交互。
  • 圖中背景方塊Consumer, Provider, Registry, Monitor表明部署邏輯拓普節點。
  • 圖中藍色虛線爲初始化時調用,紅色虛線爲運行時異步調用,紅色實線爲運行時同步調用。
  • 圖中只包含RPC的層,不包含Remoting的層,Remoting總體都隱含在Protocol中。

 

2.1 多種啓動方式

除了XML方式,Dubbo的服務Config還支持多種方式,包括ide

  • 註解驅動(Annotation-Driven)
  • 外部化配置(External Configuration)
  • 以及自動裝配(Auto-Configure)

具體的能夠參考 http://dubbo.apache.org/zh-cn/blog/dubbo-annotation.htmlui

下面咱們的分析以最基礎也是應用最普遍的Spring配置方式爲例。spa

 

2.2 配置信息

在配置文件中,全部dubbo的標籤,都統一用DubboBeanDefinitionParser進行解析,基於一對一屬性映射,將XML標籤解析爲Bean對象。代理

相關信息能夠參考: Dubbo中對Spring配置標籤擴展(http://www.cnblogs.com/ghj1976/p/5379332.htmlhtm

以 dubbo-demo-provider 爲例, 它的配置文件以下:

  • com.alibaba.dubbo.demo.provider.DemoServiceImpl 是服務實現類。
  • com.alibaba.dubbo.demo.DemoService 是服務須要實現的接口。

2.3 配置文件的解析過程

  • 基於dubbo.jar內的META-INF/spring.handlers配置,Spring在遇到dubbo名稱空間時,會回調DubboNamespaceHandler。
  • 全部dubbo的標籤,都統一用DubboBeanDefinitionParser進行解析,基於一對一屬性映射,將XML標籤解析爲Bean對象。

每一個service方法的配置會解析成對應的 com.alibaba.dubbo.config.spring.ServiceBean<T> 類的實例。

 

2.4 服務註冊和引用

在Bean對象實例化的過程當中,參考Spring Bean對象的生命週期,依次實現了不一樣的方法完成註冊和引用。

關於Spring對象的生命週期,能夠參考 http://www.javashuo.com/article/p-xvmqcili-a.html

在 afterPropertiesSet 後, 會調用到 ServiceConfig.export() ,具體的調用棧以下

相關文章
相關標籤/搜索