1、源碼模塊
官網地址html
源碼地址spring
1.1 源碼模塊組織
Dubbo工程是一個Maven多Module的項目,以包結構來組織各個模塊。apache
![](http://static.javashuo.com/static/loading.gif)
核心模塊及其關係,如圖所示:負載均衡
![](http://static.javashuo.com/static/loading.gif)
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的應用會在啓動時完成服務註冊或訂閱(不管是生產者,仍是消費者)以下圖所示。異步
![](http://static.javashuo.com/static/loading.gif)
- 圖中小方塊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 爲例, 它的配置文件以下:
![](http://static.javashuo.com/static/loading.gif)
- 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() ,具體的調用棧以下
![](http://static.javashuo.com/static/loading.gif)