天天看點

Dubbo服務發現源碼解析

一、源碼子產品

1.1 源碼子產品組織

Dubbo工程是一個Maven多Module的項目,以包結構來組織各個子產品。

Dubbo服務發現源碼解析

核心子產品及其關系,如圖所示:

Dubbo服務發現源碼解析

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 容器去加載服務。

二、服務發現

Dubbo的應用會在啟動時完成服務注冊或訂閱(不論是生産者,還是消費者)如下圖所示。

Dubbo服務發現源碼解析

圖中小方塊Protocol, Cluster, Proxy, Service, Container, Registry, Monitor代表層或子產品,藍色的表示與業務有互動,綠色的表示隻對Dubbo内部互動。

圖中背景方塊Consumer, Provider, Registry, Monitor代表部署邏輯拓普節點。

圖中藍色虛線為初始化時調用,紅色虛線為運作時異步調用,紅色實線為運作時同步調用。

圖中隻包含RPC的層,不包含Remoting的層,Remoting整體都隐含在Protocol中。

2.1 多種啟動方式

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

注解驅動(Annotation-Driven)

外部化配置(External Configuration)

以及自動裝配(Auto-Configure)

具體的可以參考

http://dubbo.apache.org/zh-cn/blog/dubbo-annotation.html

下面我們的分析以最基礎也是應用最廣泛的Spring配置方式為例。

2.2 配置資訊

在配置檔案中,所有dubbo的标簽,都統一用DubboBeanDefinitionParser進行解析,基于一對一屬性映射,将XML标簽解析為Bean對象。

相關資訊可以參考: Dubbo中對Spring配置标簽擴充(

http://www.cnblogs.com/ghj1976/p/5379332.html

以 dubbo-demo-provider 為例, 它的配置檔案如下:

Dubbo服務發現源碼解析

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 類的執行個體。

2.4 服務注冊和引用

在Bean對象執行個體化的過程中,參考Spring Bean對象的生命周期,依次實作了不同的方法完成注冊和引用。

關于Spring對象的生命周期,可以參考

https://www.cnblogs.com/zrtqsk/p/3735273.html

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

Dubbo服務發現源碼解析