这一部分主要梳理Dubbo的服务发布的原理,会涉及dubbo-config等模块内容,从以下几个方面来一步一步深入学习。
dubbo-config模块包括dubbo-config-api 和dubbo-config-spring 。
dubbo-config-api中重要的类包括ReferenceConfig和ServiceConfig,分别处理消费端的配置(服务引用)和提供服务端的配置(服务发布)
dubbo-config-spring 主要是扩展spring配置标签的扩展;
服务发布的开始还是要从ServiceBean说起,我们利用idea的工具查看ServiceBean的继承体系图。
里面有许多与spring相关的东西,其中重要的关注点是InitializeBean和ApplicationListener。我们会遇到这样的配置
|
|
当我们设置为delay=“5000”时,意味着设置延时暴露,这个时候就是通过回调InitializingBean接口的afterPropertySet()方法进行服务发布的。
|
|
当我们设置为delay=“-1”或者不设置时,意味着延迟到 Spring 初始化完成后, 再暴露服务,这个时候会通知实现了ApplicationListener的接口进行回调onApplicationEvent方法进行服务发布。
|
|
重要的方法出现了,就是ServiceBean继承ServiceConfig的export()。
|
|
接着就是doExport()方法,前面是做了一系列的检查,provider,application,module,registries,monitor这些参数是否为空,是否是GenericService类型的服务,检查要注册的bean的引用和方法等。在方法的最后会调用doExportUrls方法。
|
|
|
|
总结整个服务暴露的流程:
首先会检查各种配置信息,填充各种属性,总之就是保证我在开始暴露服务之前,所有的东西都准备好了,并且是正确的。doExport()
加载所有的注册中心,因为我们要暴露的服务需要注册到注册中心中去。doExportUrls()
根据配置的协议和注册中心url分别进行导出。doExportUrlsFor1Protocol()
根据配置筛入一些信息,重点在scope, 如果没有配置scope,即scope =null 时候,同时进行本地和远程暴露;如果scope = “none” 则不进行暴露;如果scope=”remote”只进行远程暴露;如果scope=”local”只进行本地暴露;
后面详细讲解不同暴露的流程。