前置概念:
容器(来自百度百科): Spring 提供容器功能,容器可以管理对象的生命周期、对象与对象之间的依赖关系,您可以使用一个配置文件(通常是XML),在上面定义好对象的名称、如何产生(Prototype 方式或Singleton 方式)、哪个对象产生之后必须设定成为某个对象的属性等,在启动容器之后,所有的对象都可以直接取用,不用编写任何一行程序代码来产生对象,或是建立对象与对象之间的依赖关系。
换个更直白点的说明方式:容器是一个Java 所编写的程序,原先必须自行编写程序以管理对象关系,现在容器都会自动帮您作好。
常用容器:WebSphere,WebLogic,Resin,Tomcat
->循环启动dubbo容器(图1.1 )
dubbo源码分析之provider启动流程分析_源码分析
图1.1
->启动到spring容器的时候,将dubbo自身的spring自定义配置加载到spring容器中(这一部分,在dubbo config中完成),参与spring生命周期。( 图1.2
dubbo源码分析之provider启动流程分析_Dubbo教程_02
图1.2
-> spring容器在启动的过程中会解析自定义的schema元素将dubbo转换成ServiceBean,并且ServiceBean也实现了ApplicationListener 接口,finishRefresh会触发ContextRefreshedEvent事件,加上ServiceBean实现了ApplicationContextAware 接口,注册了监听事件,所以在触发该事件的时候,执行了export()服务暴露的方法。也就是说,服务的暴露是在spring容器初始化完成之后紧接着进行的。( 图1.3
dubbo源码分析之provider启动流程分析_Dubbo教程_03
图1.3
->具体暴露的实现,export(),首先进行一些属性的初始化,然后
-->doExport() 暴露前的准备工作(eg:兼容性工作。。)
-->doExportUrls() 支持多协议配置,遍历所有协议分别根据不同的协议把服务export到不同的注册中心上去
-->loadRegistries(true); checkRegistry如果xml中没有配置注册中,从dubbo.properties中读取配置,构建RegistryConfig对象并赋值
构建注册中心URL统一数据模式集合List<registryUrl>
-->doExportUrlsFor1Protocol 根据具体协议暴露服务
-->暴露服务关键代码( 图1.4
dubbo源码分析之provider启动流程分析_Dubbo教程_04
图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):
dubbo源码分析之provider启动流程分析_源码分析_05
图1.5
-->protocol.export() 动态的生成Protocol$Adpative类,然后根据传入的invoker中的url参数,
用getExtension方法获取到经过包装的exporter。(参考之前写过的getExtension方法分析)(图 图1.6
dubbo源码分析之provider启动流程分析_源码分析_06
图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)
dubbo源码分析之provider启动流程分析_源码分析_07
图1.7
dubbo源码分析之provider启动流程分析_Dubbo教程_08
图1.8
dubbo源码分析之provider启动流程分析_源码分析_09
图1.9
dubbo源码分析之provider启动流程分析_源码分析_10

图1.10

dubbo源码分析之provider启动流程分析_Dubbo教程_11