服务导出的方法入口是ServiceBean这个dubbo中的自定义类,ServiceBean由于实现了spring的ApplicationListener接口,重写了onApplicationEvent方法,所以当spring启动完成后,会调用onApplicationEvent方法,该方法中会执行export方法,执行启动netty(配置的dubbo协议就使用netty)或者tomcat(配置的http协议就使用tomcat),以及dubbo服务导出,包括读取ServiceBean中的属性(这些属性值由@Service注解中配置或者其他地方同步而来,另外dubbo的一个信息可以从四个地方进行配置,如@Service注解中,properties文件中,dubbo的管理台界面上,idea的Run/Debug configurations的VM options中,这几个地方的配置是有优先级的),将服务注册到注册中心,以及服务提供者监听管理台的动态配置等。ServiceBean#export方法具体会执行如下方法:
1) super.export()方法
此方法会进入到serviceConfig#export方法中执行如下方法;
1.1)checkAndUpdateSubConfigs方法
该方法主要是确定服务参数,配置参数从两个维度去看,一个是子应用遵循上级应用的配置,一个是同一个应用中的相同配置按照优先级顺序去获取;针对第一条,如果子应用没有配置某个参数,但是上一级应用配置了,则那么子应用就会继承这个上级应用的参数;接着再判断第二条,如果相同配置的参数有好几个地方配置了,则按照优先级取;在Dubbo中,除了可以在@Service注解中给服务配置参数,还有其他地方也可以给服务配置参数,比如:
a)dubbo.properties文件,dubob的源码中封装成了PropertiesConfiguration类;
b)管理台,dubbo在2.7版本后就支持了分布式管理台,可以在Dubbo-Admin中去操作配置;管理台分为全局配置和应用配置,在dubbo的源码中AppExternalConfiguration表示应用配置,ExternalConfiguration表示全局配置。
3. 系统环境变量,你可以在启动程序时,通过idea的-D的方式来指定参数,在dubbo的源码中封装成了SystemConfiguration类;
4. @Service注解所配置的参数,在dubbo的源码中封装成了AbstractConfig类;
服务的参数可以从这四个位置来,这四个位置上如果配了同一个参数的话,优先级从高到低如下:
SystemConfiguration -> AppExternalConfiguration -> ExternalConfiguration ->AbstractConfig -> PropertiesConfiguration,可见,-D方式配置的参数优先级最高,管理台次之,注解随后,dubbo.properties最后。
源码中这几个参数是linkedList组织的,源码中有个布尔类型参数,设置后可以使AbstractConfig排在第二,如下:
SystemConfiguration -> AbstractConfig ->AppExternalConfiguration -> ExternalConfiguration -> PropertiesConfiguration
1.2)doExport方法
1.2.1)doExportUrls方法
1.2.1.1)loadRegistries方法
拿到注册中心的地址及相关信息,拼接成一个url,例如:
1.2.1.2)doExportUrlsFor1Protocol方法
针对不同协议,如dubbo协议或者http协议,分别构造其url,然后再将url分别发往不同的注册中心地址;
例如,最终存到注册中心的url如下,注册中心存的是字符串;
2)publishExportEvent();
未完待续…