Dubbo的應用會在啟動時完成服務注冊或訂閱(不論是生產者,還是消費者)如下圖所示。
- 圖中小方塊Protocol, Cluster, Proxy, Service, Container, Registry, Monitor代表層或模塊,藍色的表示與業務有交互,綠色的表示只對Dubbo內部交互。
- 圖中背景方塊Consumer, Provider, Registry, Monitor代表部署邏輯拓普節點。
- 圖中藍色虛線為初始化時調用,紅色虛線為運行時異步調用,紅色實線為運行時同步調用。
- 圖中只包含RPC的層,不包含Remoting的層,Remoting整體都隱含在Protocol中。
整個服務初始化的過程細節如下:
解析服務
配置信息
在配置文件中,所有dubbo的標簽,都統一用DubboBeanDefinitionParser進行解析,基於一對一屬性映射,將XML標簽解析為Bean對象。
相關信息可以參考: Dubbo中對Spring配置標簽擴展(http://www.cnblogs.com/ghj1976/p/5379332.html)
以 dubbo-demo-provider 為例, 它的配置文件如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />
</beans>
com.alibaba.dubbo.demo.provider.DemoServiceImpl 是服務實現類。
com.alibaba.dubbo.demo.DemoService 是服務需要實現的接口。
配置文件的解析過程
- 基於dubbo.jar內的META-INF/spring.handlers配置,Spring在遇到dubbo名稱空間時,會回調DubboNamespaceHandler。
- 所有dubbo的標簽,都統一用DubboBeanDefinitionParser進行解析,基於一對一屬性映射,將XML標簽解析為Bean對象。
每個service方法的配置會解析成對應的 com.alibaba.dubbo.config.spring.ServiceBean<T> 類的實例。
具體請參考:Dubbo中對Spring配置標簽擴展 (http://www.cnblogs.com/ghj1976/p/5379332.html)
配置文件對應的配置類的關系圖如下:
根據 Spring Bean 的生命周期(http://www.cnblogs.com/ghj1976/p/5383743.html)
在 afterPropertiesSet 后, 會調用到 ServiceConfig.export() 。
生產者在ServiceConfig.export()或消費者在ReferenceConfig.get()初始化時,將Bean對象轉換URL格式,所有Bean屬性轉成URL的參數。
它的調用堆棧如下圖:
然后將URL傳給Protocol擴展點,基於擴展點的Adaptive機制,根據URL的協議頭,進行不同協議的服務暴露或引用。
public interface Protocol {
/**
* 暴露遠程服務:<br>
* 1. 協議在接收請求時,應記錄請求來源方地址信息:RpcContext.getContext().setRemoteAddress();<br>
* 2. export()必須是冪等的,也就是暴露同一個URL的Invoker兩次,和暴露一次沒有區別。<br>
* 3. export()傳入的Invoker由框架實現並傳入,協議不需要關心。<br>
*
* @param <T> 服務的類型
* @param invoker 服務的執行體
* @return exporter 暴露服務的引用,用於取消暴露
* @throws RpcException 當暴露服務出錯時拋出,比如端口已占用
*/
@Adaptive
<T> Exporter<T> export(Invoker<T> invoker) throws RpcException;