博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dubbox源码分析(一)-服务的启动与初始化
阅读量:5978 次
发布时间:2019-06-20

本文共 2847 字,大约阅读时间需要 9 分钟。

程序猿成长之路少不了要学习和分析源码的。最近难得能静得下心来,就针对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的 

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,而调用的协议都是可变可扩展的。观察者模式就更随处可见了。

转载于:https://www.cnblogs.com/syjkfind/p/5957510.html

你可能感兴趣的文章
三叶虫为什么可以成为地球生物圈的第一个霸主?
查看>>
聚焦数据智能,袋鼠云亮相2018云栖大会
查看>>
华为发布首款全面屏+四摄手机 主流手机市场迎新貌
查看>>
智慧城市物联网收入将在2026年达620亿美元
查看>>
NBA公布新秀赛名单:塔图姆、西蒙斯领衔 欧文成教练
查看>>
120幅中国近现代国画大师真迹长沙展出
查看>>
中诚信报告预计2019年中国GDP增长率约6.3%
查看>>
DataCamp推出的Python数据科学速查表,已经翻译成中文啦!
查看>>
Python开发必备利器之Virtual Environment
查看>>
这是一条保证看饿的消息 老字号天福号280岁了!
查看>>
RSAC 2018:人工智能成为驱动网络安全的新 “引擎”
查看>>
程序员必备:SQL优化指南
查看>>
这周为公司撸了一个「自动分配任务系统」
查看>>
一个真实的Async/Await示例
查看>>
vue 项目快速输出微信、支付宝、百度小程序
查看>>
js实现万级数字转汉字显示
查看>>
这个七夕,送你一份程序员教科书级别的告白指南
查看>>
Quantum 初探
查看>>
Android LayoutInflater Factory 源码解析
查看>>
React Native for Android 原理分析与实践:实现原理
查看>>