likes
comments
collection
share

Dubbo源码|十四、Dubbo服务暴露—配置检查更新

作者站长头像
站长
· 阅读数 11

开篇

本文主要介绍Dubbo服务的暴露过程的服务导出阶段,服务配置的检查以及更新。

在服务导出的时候,Dubbo会先遍历所有的Dubbo服务也就是拿到所有的ServiceBean,然后依次调用每个ServiceBeanexport方法进行导出。

导出服务

导出服务exportServices

导出服务的方法位于DubboBootstrap#exportServices方法中。

Dubbo源码|十四、Dubbo服务暴露—配置检查更新

先从configManager对象配置缓存configCache中获取所有的ServiceBean,还记得configCache内容是什么样子的吗?再来回顾一下:

Dubbo源码|十四、Dubbo服务暴露—配置检查更新

拿到所有的ServiceBean后,代码中为ServiceConfig,因为ServiceBean继承了ServiceConfig。循环遍历ServiceBean,判断是否为异步,如果是异步的话,使用线程池,提交一个导出服务任务,不是异步的话,调用exportService方法进行下一步处理。

exportService的方法逻辑也很简单,调用ServiceConfigexport方法进行导出,然后把导出的服务的服务名放到一个叫exportedServices的缓存中。

export

export方法整体看起来不复杂,主要过程如下:

  1. 判断bootstrap对象是否初始化,没有的话,进行初始化操作,初始化操作上篇已经介绍了,这里不再赘述。
  2. 检查并更新服务的参数。
  3. 完善serviceMetadata的参数:versiongroupdefaultGroupserviceInterfaceNameserviceTypetarget等属性值。
  4. 检查是否应该被导出。
  5. 如果是延迟暴露,则使用线程池任务调用doExport方法导出。
  6. 如果是正常导出,直接调用doExport方法。
  7. 发送导出完成事件。

Dubbo源码|十四、Dubbo服务暴露—配置检查更新

检查、更新配置

Dubbo源码|十四、Dubbo服务暴露—配置检查更新

checkAndUpdateSubConfigs方法主要是检查并更新配置,主要流程如下:

  1. 检查ServiceConfig的配置,如果ServiceConfig中的某些属性如果是空的,那么就从AbstractInterfaceConfigModuleConfigApplicationConfigProviderConfig中获取并赋值给ServiceConfig对象中对应的属性。
  2. 检查provider属性值是否为空,如果为空的话,创建一个新的ProviderConfig并赋值给他。
  3. 检查协议,如果没有单独的配置protocols,则从provider获取配置的协议并赋值给ServiceConfig对应的属性。
  4. 如果配置中心的全局配置或应用配置中也配置了一个协议,那么就会被添加到ServiceConfig中。
  5. 如果protocol协议配置的不是只有injvm协议,那么就需要把服务注册到注册中心里去。
  6. 检查注册中心的配置,如果没有配置的话,从application对象里获取
  7. 刷新ServiceConfig配置
  8. 检查当前服务是否为泛化服务
  9. 检查Stub、Local、Mock
  10. 检验ServiceConfig配置的值是否合法,长度、非法字符等
  11. 通过SPI调用ConfigPostProcessor实现类,进行配置的后置处理

Refresh刷新

这里的刷新是指,要获取并确定ServiceConfig各个属性值的最终值,有优先级顺序,优先级高得会覆盖优先级低的配置。优先级顺序高低逻辑代码位于方法getPrefixedConfiguration

配置覆盖的优先级的默认顺序为:系统变量 > 配置中心应用配置 > 配置中心全局配置 > 注解或xml中定义 > dubbo.properties文件。

一个ServiceConfig对象的属性值,可能在不同的配置里有不同的值,比如timeout属性,可以按照上锁的优先级去寻找具体的值。

Dubbo源码|十四、Dubbo服务暴露—配置检查更新

配置优先级

Dubbo源码|十四、Dubbo服务暴露—配置检查更新

从这段代码中可以看到,优先级的顺序其实有两种,默认为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中定义的顺序就比配置中心的优先级高了。

后记

Dubbo服务的暴露前期准备工作做得很多,各种检查、初始化,下一篇将介绍具体的导出过程。

转载自:https://juejin.cn/post/7176053774073462839
评论
请登录