14. Dubbo服务暴露 - 配置检查更新
1. 开篇
本文主要介绍Dubbo服务的暴露过程的服务导出阶段,服务配置的检查以及更新。
在服务导出的时候,Dubbo
会先遍历所有的Dubbo
服务也就是拿到所有的ServiceBean
,然后依次调用每个ServiceBean
的export
方法进行导出。
2. 导出服务
2.1 导出服务exportServices
导出服务的方法位于DubboBootstrap#exportServices
方法中。
先从configManager
对象配置缓存configCache
中获取所有的ServiceBean
,还记得configCache
内容是什么样子的吗?再来回顾一下:
拿到所有的ServiceBean
后,代码中为ServiceConfig
,因为ServiceBean
继承了ServiceConfig
。循环遍历ServiceBean
,判断是否为异步,如果是异步的话,使用线程池,提交一个导出服务任务,不是异步的话,调用exportService
方法进行下一步处理。
exportService
的方法逻辑也很简单,调用ServiceConfig
的export
方法进行导出,然后把导出的服务的服务名放到一个叫exportedServices
的缓存中。
2.2 export
export
方法整体看起来不复杂,主要过程如下:
- 判断bootstrap对象是否初始化,没有的话,进行初始化操作,初始化操作上篇已经介绍了,这里不再赘述。
- 检查并更新服务的参数。
- 完善
serviceMetadata
的参数:version
、group
、defaultGroup
、serviceInterfaceName
、serviceType
、target
等属性值。 - 检查是否应该被导出。
- 如果是延迟暴露,则使用线程池任务调用
doExport
方法导出。 - 如果是正常导出,直接调用
doExport
方法。 - 发送导出完成事件。
2.3 检查、更新配置
checkAndUpdateSubConfigs
方法主要是检查并更新配置,主要流程如下:
- 检查
ServiceConfig
的配置,如果ServiceConfig
中的某些属性如果是空的,那么就从AbstractInterfaceConfig
、ModuleConfig
、ApplicationConfig
、ProviderConfig
中获取并赋值给ServiceConfig
对象中对应的属性。 - 检查
provider
属性值是否为空,如果为空的话,创建一个新的ProviderConfig
并赋值给他。 - 检查协议,如果没有单独的配置
protocols
,则从provider
获取配置的协议并赋值给ServiceConfig
对应的属性。 - 如果配置中心的全局配置或应用配置中也配置了一个协议,那么就会被添加到
ServiceConfig
中。 - 如果
protocol
协议配置的不是只有injvm
协议,那么就需要把服务注册到注册中心里去。 - 检查注册中心的配置,如果没有配置的话,从
application
对象里获取 - 刷新
ServiceConfig
配置 - 检查当前服务是否为泛化服务
- 检查Stub、Local、Mock
- 检验
ServiceConfig
配置的值是否合法,长度、非法字符等 - 通过
SPI
调用ConfigPostProcessor
实现类,进行配置的后置处理
2.4 Refresh刷新
这里的刷新是指,要获取并确定ServiceConfig
各个属性值的最终值,有优先级顺序,优先级高得会覆盖优先级低的配置。优先级顺序高低逻辑代码位于方法getPrefixedConfiguration
。
配置覆盖的优先级的默认顺序为:系统变量 > 配置中心应用配置 > 配置中心全局配置 > 注解或xml中定义 > dubbo.properties文件。
一个ServiceConfig
对象的属性值,可能在不同的配置里有不同的值,比如timeout
属性,可以按照上锁的优先级去寻找具体的值。
2.5 配置优先级
从这段代码中可以看到,优先级的顺序其实有两种,默认为SystemConfiguration -> AppExternalConfiguration -> ExternalConfiguration -> AbstractConfig -> PropertiesConfiguration
,也就是上面说的系统变量 > 配置中心应用配置 > 配置中心全局配置 > 注解或xml中定义 > dubbo.properties文件
。
这个顺序可以根据configCenterFirst
来确定,如果为true
的话,就是默认顺序,如果为false
的话,那么顺序就变为:SystemConfiguration -> AbstractConfig -> AppExternalConfiguration -> ExternalConfiguration -> PropertiesConfiguration
,也就是系统变量 > 注解或xml中定义 > 配置中心应用配置 > 配置中心全局配置 > dubbo.properties文件
。
那么这个值是如何改变呢?
可以通过配置来改变:
dubbo.config-center.highest-priority=false
设置为false之后,注解或xml
中定义的顺序就比配置中心的优先级高了。
3. 后记
Dubbo服务的暴露前期准备工作做得很多,各种检查、初始化,下一篇将介绍具体的导出过程。