第1节 initialize()的调用过程
DubboBootstrap.initialize()方法用于初始化Dubbo容器,详细的调用过程如下图所示。
1)初始化Environment,ConfigManager,ServiceRepository全局framework对象。
2)启动configCenter配置中心,构建configuration客户端对象,成功连接到config server。
3)加载远程配置。
4)校验全局配置。
5)启动元数据配置中心。
6)初始化元数据服务实例。
7)初始化事件监听器。
第2节 initFrameworkExts()的调用过程
initFrameworkExts()方法用于加载FrameworkExt接口的实现类,创建所有的实现类对象,并执行initialize()初始化操作,详细的调用过程如下图所示。
1)加载FrameworkExt SPI接口的实现类。
2)创建FrameworkExt接口的所有实现类的实例,会创建Environment,ConfigManager,ServiceRepository这些全局framework对象。
3)对所有framework对象执行initialize()初始化。执行environment.initialize()方法时,会执行configManager.getDefaultConfigCenter()加载默认的config-center配置,即xml中<dubbo:config-center>标签对应的配置。
当xml中没有配置<dubbo:config-center>,后续会将<dubbo:registry>配置转换成config-center配置。
第3节 startConfigCenter()的调用过程
startConfigCenter()方法用于启动动态configCenter配置中心,会创建configCenter客户端,并与配置中心服务端建立好连接。
Dubbo支持很多种配置中心:zookeeper,apollo,nacos,consul,etcd等。
startConfigCenter()方法的详细调用过程如下图所示:
(第一步)如果没有配置<dubbo:config-center>,将registry配置转换成configCenter配置,并加入configManager中。
启动spring的dubbo-providerxml配置如下:
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="dubbo2-provider"/>
<dubbo:registry address="zookeeper://172.16.4.126:2181"/>
<dubbo:metadata-report address="zookeeper://172.16.4.126:2181"/>
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:service interface="org.example.dubbo2.provider.api.GreetingsService" ref="greetingsService"/>
<bean id="greetingsService" class="org.example.dubbe2.provider.impl.GreetingsServiceImpl"/>
</beans>
DubboBootstrap.initialize()方法执行完后,没有配置<dubbo:cofig-center>,configManager的状态如下。
DubboBootstrap.useRegistyAsConfigCenterIfNecessary()方法执行完之后,将registry配置转换成config-center配置加入configManager,如下图所示。
(第二步)构建CompositeDynamicConfiguration对象。
(第三步)通过config-center配置构建DynamicConfiguration对象,调用prepareEnvironment()方法完成,其中会创建configCenter的客户端对象,并成功连接上configCenter服务端,如果连接失败会抛出异常,进程退出。然后从configCenter服务端读取/dubbo/config/dubbo/dubbo.properties的内容并更新到enviroment中,接着从configCenter服务端读取/dubbo/config/{dubbo:application.name}/dubbo.properties的内容并更新到environment中, 最后将DynamicConfiguration对象加入CompositeDynamicConfiguration对象。
(第四步)将CompositeDynamicConfiguration对象加入environment对象中。
(第五步)刷新configManager的配置信息。