程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> dubbox源碼分析(一)-服務的啟動與初始化,dubbox源碼

dubbox源碼分析(一)-服務的啟動與初始化,dubbox源碼

編輯:JAVA綜合教程

dubbox源碼分析(一)-服務的啟動與初始化,dubbox源碼


程序猿成長之路少不了要學習和分析源碼的。最近難得能靜得下心來,就針對dubbox為目標開始進行源碼分析。

【服務提供方】

步驟 調用順序 備注 容器啟動

com.alibaba.dubbo.container.Main.main(args);
dubbo.properties -> dubbo.container -> container.start()
container -> spring, log4j, jetty...

[dubbo-container-spring] SpringContainer.java -> [服務提供方]classpath*:META-INF/spring/*.xml -> dubbo.xsd

spring的 ApplicationContext介紹

bean初始化

<dubbo:service>等自定義標簽 -> [dubbo-config-spring] DubboNamespaceHandler.java
 -> new DubboBeanDefinitionParser(ServiceBean.class, true)

spring對bean的初始化操作

[dubbo-config-spring] ServiceBean.java -> afterPropertiesSet()
-> setProvider(), setApplication(), setModule(), setRegistries, setMonitor(), setProtocols, setPath() -> export()

自定義標簽的解析和初始化 連接注冊中心

ServiceBean.export() -> ServiceConfig.java -> doExportUrlsFor1Protocol() -> 暴露協議protocol.export()

protocol=ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension()---Protocol$Adaptive.java
-> ExtensionLoader.loadExtensionClasses() -> loadFile()
-> META-INF/dubbo/internal/,META-INF/dubbo/,META-INF/services/
-> [舉例dubbo-rpc-api] 配置文件com.alibaba.dubbo.rpc.Protocol
-> filter,listener,mock -> 各類的export()

protocol.export()調用鏈 -> [dubbo-registry-api] RegistryProtocol.export()
-> getRegistry()---(ZookeeperRegistry.java -> 擴展的ZookeeperClient)
-> registry.subscribe()加入監聽列表

注冊到注冊中心,
並加入監聽列表監聽注冊中心的消息通知。 啟動協議服務器 protocol.export()調用鏈 -> [dubbo-rpc-rest] RestProtocol.export()
-> doExport() -> server.start(), server.deploy() 根據相應協議啟動相應服務器

【服務使用方】

步驟 調用順序 備注 容器啟動 參考服務提供方  同provider bean初始化

<dubbo:reference>等自定義標簽 -> [dubbo-config-spring] DubboNamespaceHandler.java
-> new DubboBeanDefinitionParser(ReferenceBean.class, false)

 同provider 連接注冊中心

ReferenceBean.java -> afterPropertiesSet() -> ReferenceConfig.init() -> createProxy() -> refprotocol.refer()

refprotocol=ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension()---Protocol$Adaptive.java
-> ExtensionLoader.loadExtensionClasses() -> loadFile()
-> META-INF/dubbo/internal/,META-INF/dubbo/,META-INF/services/
-> [舉例dubbo-rpc-api] com.alibaba.dubbo.rpc.Protocol -> filter,listener,mock -> 各類的refer()

protocol.refer()調用鏈 -> [dubbo-registry-api] RegistryProtocol.refer()
-> getRegistry()---(ZookeeperRegistry.java -> 擴展的ZookeeperClient) -> doRefer()
-> RegistryDirectory.subscribe() -> registry.subscribe()

 同provider 服務接口初始化

ReferenceConfig.init() -> createProxy()
-> AbstractProxyFactory.getProxy() -> JavassistProxyFactory.getProxy()

service接口在實際運行時是 com.alibaba.dubbo.common.bytecode.Proxy 類的實例

 同provider

總結與收獲

很多細節由於時間關系沒有展開,比如重試機制,比如比較重要的類的整理。整個分析的過程還是很多收獲與啟發的。

比如url.putParameter()每次設置參數卻返回了一個新的對象,算是一種copyOnWrite的簡單實現。

又比如幾個比較重要的類都通過ExtensionLoader實現了動態擴展,可以理解為一種引擎或一種類加載器擴展,啟動時動態掃描@Adaptive注解和配置文件,所以各個模塊只要修改配置就可以實現filter, listener和mock的擴展。

再比如,典型的代理模式的應用,consumer都是通過反射生成服務接口的代理實例,實現遠程調用provider,而調用的協議都是可變可擴展的。觀察者模式就更隨處可見了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved