1. 程式人生 > >dubbo原始碼淺析(二)-標籤解析

dubbo原始碼淺析(二)-標籤解析

前面瞭解了dubbo的外掛化機制之後,接下來進入正題,研究一下dubbo的核心原理,由於dubbo的功能配置較多,為了更高效的研讀程式碼,在閱讀的過程中儘量忽略一些細節,重點關注它的主幹流程,主幹瞭解清楚之後再去分析它的一些細節功能就更輕鬆了,否則容易陷入各種細枝末節不能自拔讓整個程式碼的閱讀週期變得冗長無比效率大打折扣。
Dubbo框架中,服務提供者和服務消費是兩個核心角色,所以主要通過服務提供者初始化、服務消費者初始化、服務呼叫流程這三個部分來分析dubbo框架是如何為我們的應用實現遠端呼叫的。
做任何事之前都要找到開始的地方,閱讀框架程式碼也不例外,對dubbo框架來說它的最佳入口無疑是使用它的地方,由於Spring IOC框架在java後端程式的廣泛應用,大部分程式都是結合Spring IOC框架使用dubbo框架,如下所示:

<dubbo:application name="${dubbo.application.name}"
       owner="${dubbo.application.owner}" organization="${dubbo.application.organization}"
       logger="log4j" environment="${dubbo.environment}" />
    <dubbo:protocol name="dubbo" port="-1" accesslog="false" />
    <dubbo:registry address="${dubbo.registry.address}"
check="false" /> <dubbo:monitor protocol="registry" /> <dubbo:provider delay="-1" group="${dubbo.provider.group}" version="1.0" timeout="5000" filter="-monitor,traceFilter" dispatcher="kaolaall" /> <dubbo:service interface="com.netease.haitao.mykaola.compose.api.UserBrandFacadeService"
ref="userBrandFacadeServiceImpl" /> <dubbo:consumer group="${dubbo.consumer.group}" cluster="failfast" version="1.0" check="false" filter="-monitor,traceFilter" /> <dubbo:reference id="sendCouponRemoteApiImpl" interface="com.netease.haitao.online.web.remote.api.SendCouponRemoteApi" group="${dubbo.jxc.group}" />

上面的配置向dubbo框架註冊了應用名稱、框架協議、提供者全域性屬性、服務介面、消費者全域性屬性、服務消費者,下面就由這段簡單的配置入手來分析一下服務提供者初始化和服務消費者初始化。
從上面的使用示例可以看到,dubbo框架擴充套件了一套dubbo標籤,先簡單瞭解一下Spring的標籤擴充套件機制。Spring框架提供了兩個介面:NamespaceHandler負責namespace處理和BeanDefinitionParser負責bean的解析。
程式碼
這裡寫圖片描述
使用者可以實現NamespaceHandler介面,然後可以在classpath(包括class檔案路徑和jar包中的路徑)的META-INF目錄下編寫一個spring.handlers檔案,該檔案中定義名稱空間URL和名稱空間處理器類的對映,如dubbo框架的spring.handlers檔案內容如下:

http\://code.alibabatech.com/schema/dubbo=com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler

Spring框架初始化時會載入所有classpath的spring.handlers檔案,把namespace URL和namespace處理器的對映存到一個Map中,Spring框架在解析bean定義文件時,遇到了非IOC內建(beans名稱空間下)的標籤,會在這個Map中查詢namespace處理器,使用這個自定義的處理器來進行標籤解析工作,可以在DefaultBeanDefinitionDocumentReader和BeanDefinitionParserDelegate類中看到相關的程式碼:
這裡寫圖片描述
Dubbo框架實現了DubboNamespaceHandler 來處理dubbo名稱空間:
這裡寫圖片描述
處理器初始化時給dubbo所有標籤都註冊了一個解析器,其他的標籤主要任務是給框架設定一些全域性屬性可以暫時先放一邊,重點需要看下service和reference兩個標籤,它們分別用來註冊服務和服務消費者,dubbo:service會被框架解析成一個ServiceBean,dubbo:reference會被框架解析成一個ReferenceBean。