dubbo源码分析之provider启动流程分析
原创wx58216ff6419a2 ©著作权
©著作权归作者所有:来自51CTO博客作者wx58216ff6419a2的原创作品,请联系作者获取转载授权,否则将追究法律责任
前置概念:
容器(来自百度百科):
Spring 提供容器功能,容器可以管理对象的生命周期、对象与对象之间的依赖关系,您可以使用一个配置文件(通常是XML),在上面定义好对象的名称、如何产生(Prototype 方式或Singleton 方式)、哪个对象产生之后必须设定成为某个对象的属性等,在启动容器之后,所有的对象都可以直接取用,不用编写任何一行程序代码来产生对象,或是建立对象与对象之间的依赖关系。
换个更直白点的说明方式:容器是一个Java 所编写的程序,原先必须自行编写程序以管理对象关系,现在容器都会自动帮您作好。
常用容器:WebSphere,WebLogic,Resin,Tomcat
->循环启动dubbo容器(图1.1 )
图1.1
->启动到spring容器的时候,将dubbo自身的spring自定义配置加载到spring容器中(这一部分,在dubbo config中完成),参与spring生命周期。(
图1.2)
图1.2
->
spring容器在启动的过程中会解析自定义的schema元素将dubbo转换成ServiceBean,并且ServiceBean也实现了ApplicationListener
接口,finishRefresh会触发ContextRefreshedEvent事件,加上ServiceBean实现了ApplicationContextAware
接口,注册了监听事件,所以在触发该事件的时候,执行了export()服务暴露的方法。也就是说,服务的暴露是在spring容器初始化完成之后紧接着进行的。(
图1.3
)
图1.3
->具体暴露的实现,export(),首先进行一些属性的初始化,然后
-->doExport() 暴露前的准备工作(eg:兼容性工作。。)
-->doExportUrls()
支持多协议配置,遍历所有协议分别根据不同的协议把服务export到不同的注册中心上去
-->loadRegistries(true);
checkRegistry如果xml中没有配置注册中,从dubbo.properties中读取配置,构建RegistryConfig对象并赋值
构建注册中心URL统一数据模式集合List<registryUrl>
-->doExportUrlsFor1Protocol
根据具体协议暴露服务
-->暴露服务关键代码(
图1.4
)
图1.4
--> exportLocal(url);本地暴露,依据scope值,判断作何暴露
{小细节,进入到 exportLocal后,会判断协议类型,如何不是injvm,会将dubbo转为injvm,然后暴露}
-->***(暴露服务的关键点) Exporter<?> exporter = protocol.export( proxyFactory.getInvoker(ref, (Class) interfaceClass, local));
--> 代理工厂spi注入,proxyFactory.getInvoker(ref, (Class) interfaceClass, local)的执行代码(
图1.5):
图1.5
-->protocol.export() 动态的生成Protocol$Adpative类,然后根据传入的invoker中的url参数,
用getExtension方法获取到经过包装的exporter。(参考之前写过的getExtension方法分析)(图
图1.6)
图1.6
-->exporters.add(exporter); 将exporter放入List中
----------------------------------------------------远端暴露---------------------------------------------------------------------
--> loadMonitor(registryURL);
配置的了monitor加载monitor,并给URL设置MONITOR_KEY
--> Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));
远端暴露获取invoker
-->protocol.export(invoker); 因为protocol是spi获取的wrapper,这里的export()不是真正的可执行方法,而是执行抽取的功能。(
图1.7,1.8)
在真正执行export(invoker)的时候,也是netty服务暴露的开始(eg:如图1.9,1.10)
-->openServer(url);
-->ExchangeServer createServer(URL url)
-->exporters.add(exporter);
-->urls.add(url)
图1.7
图1.8
图1.9
图1.10
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Flutter Provider源码分析
前言阅读此文的彦祖,亦菲们,附送一枚Provider模板代码生成插件!我为啥要写这个插件呢?此事说来话短,我这不准备写解析Provider源码
flutter provider ide 抽象类 -
【Flink源码系列】Flink 源码分析之 Client 端启动流程分析
抛出问题首先来思考一个问题,我们在提交 Flink 任务的时候,在 F
java hadoop spring android flink -
Eureka源码分析之 Client的启动流程
简单分析一下Eureka的client启动流程
Eureka Client -
SpringMVC启动流程源码分析
Spring MVC向WEB容器中注入了两个对象:ContextLoaderListener:由AbstractContextLo
spring java Springmvc 启动流程 父子容器 -
Dubbo 源码分析之线程池
文章目录前言Dubbo 线程池分类Dubbo 线程工厂线程池拒绝策略CachedThreadPoolFixedThreadPoolLi
dubbo线程池 线程池 Dubbo 线程池源码 Dubbo 线程满了 阻塞队列 -
Dubbo 源码分析之 SPI 详解
我使用的是dubbo2.5.3的源码,有中文注释。为了更方便的学习,可以慢慢来,等这个版本掌握差不
dubbo spi jdk spi 加载 自适应 缓存