Dubbo 服務暴露注冊流程


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

image

  • 圖中小方塊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

 

配置文件對應的配置類的關系圖如下:

 

image

根據 Spring Bean 的生命周期(http://www.cnblogs.com/ghj1976/p/5383743.html

在 afterPropertiesSet 后, 會調用到 ServiceConfig.export() 。

image

生產者在ServiceConfig.export()或消費者在ReferenceConfig.get()初始化時,將Bean對象轉換URL格式,所有Bean屬性轉成URL的參數。

image

它的調用堆棧如下圖:

image

 

然后將URL傳給Protocol擴展點,基於擴展點的Adaptive機制,根據URL的協議頭,進行不同協議的服務暴露或引用。

image

 image

 

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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM