一文了解 Dubbo 3 配置工作原理(四)
xx=xxx |
consumer |
dubbo.consumer.xxx=xxx |
dubbo.consumers.{id}.xxx=xxx |
service |
dubbo.service.{interfaceName}.xxx=xxx |
无 |
reference |
dubbo.reference.{interfaceName}.xxx=xxx |
无 |
method |
dubbo.service.{interfaceName}.{methodName}.xxx=xxx dubbo.reference.{interfaceName}.{methodName}.xxx=xxx |
无 |
argument |
dubbo.service.{interfaceName}.{methodName}.{arg-index}.xxx=xxx |
无 |
2 配置来源
Dubbo 默认支持 6 种配置来源:
- JVM System Properties,JVM -D 参数
- System environment,JVM进程的环境变量
- Externalized Configuration,外部化配置,从配置中心读取
- Application Configuration,应用的属性配置,从Spring应用的Environment中提取"dubbo"打头的属性集
- API / XML /注解等编程接口采集的配置可以被理解成配置来源的一种,是直接面向用户编程的配置采集方式
- 从classpath读取配置文件 dubbo.properties
关于dubbo.properties属性:
- 如果在 classpath 下有超过一个 dubbo.properties 文件,比如,两个 jar 包都各自包含了 dubbo.properties,dubbo 将随机选择一个加载,并且打印错误日志。
- Dubbo 可以自动加载 classpath 根目录下的 dubbo.properties,但是你同样可以使用 JVM 参数来指定路径:
-Ddubbo.properties.file=xxx.properties 。
2.1 覆盖关系
如果通过多种配置来源指定了相同的配置项,则会出现配置项的互相覆盖,具体覆盖关系和优先级请参考下一小节。
3 配置加载流程
3.1 处理流程
Dubbo 配置加载大概分为两个阶段:
- 第一阶段为DubboBootstrap初始化之前,在Spring context启动时解析处理XML配置/注解配置/Java-config 或者是执行API配置代码,创建config bean并且加入到ConfigManager中。
- 第二阶段为DubboBootstrap初始化过程,从配置中心读取外部配置,依次处理实例级属性配置和应用级属性配置,最后刷新所有配置实例的属性,也就是属性覆盖。
3.2 属性覆盖
发生属性覆盖可能有两种情况,并且二者可能是会同时发生的:
- 不同配置源配置了相同的配置项
- 相同配置源,但在不同层次指定了相同的配置项
3.2.1 不同配置源
3.2.1 相同配置源
属性覆盖是指用配置的属性值覆盖config bean实例的属性,类似Spring PropertyOverrideConfigurer 的作用。
Property resource configurer that overrides bean property values in an application context definition. It pushes values from a properties file into bean definitions. Configuration lines are expected to be of the following form:
beanName.property=value
但与PropertyOverrideConfigurer 的不同之处是,Dubbo的属性覆盖有多个匹配格式,优先级从高到低依次是:
#1. 指定id的实例级配置
dubbo.{config-type}s.{config-id}.{config-item}={config-item-value}
#2. 指定name的实例级配置
dubbo.{config-type}s.{config-name}.{config-item}={config-item-value}
#3. 应用级配置(单数配置)
dubbo.{config-type}.{config-item}={config-item-value}
属性覆盖处理流程:
按照优先级从高到低依次查找,如果找到此前缀开头的属性,则选定使用这个前缀提取属性,忽略后面的配置。
3.3 外部化配置
外部化配置目的之一是实现配置的集中式管理,这部分业界已经有很多成熟的专业配置系统如 Apollo, Nacos 等,Dubbo 所做的主要是保证能配合这些系统正常工作。
外部化配置和其他本地配置在内容和格式上并无区别,可以简单理解为 dubbo.properties 的外部化存储,配置中心更适合将一些公共配置如注册中心、元数据中心配置等抽取以便做集中管理。
# 将注册中心地址、元数据中心地址等配置集中管理,可以做到统一环境、减少开发侧感知。
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.registry.simplified=true
dubbo.metadata-report.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.application.qos.port=33333
3.3.1 外部化配置使用方式
- 增加 config-center 配置
<dubbo:config-center address="zookeeper://127.0.0.1:2181"/>
- 在相应的配置中心(zookeeper、Nacos 等)增加全局配置项,如下以 Nacos 为例:
开启外部化配置后,registry、metadata-report、protocol、qos 等全局范围的配置理论上都不再需要在应用中配置,应用开发侧专注业务服务配置,一些全局共享的全局配置转而由运维人员统一配置在远端配置中心。
这样能做到的效果就是,应用只需要关心:
- 服务暴露、订阅配置
- 配置中心地址
当部署到不同的环境时,其他配置就能自动的被从对应的配置中心读取到。
举例来说,每个应用中 Dubbo 相关的配置只有以下内容可能就足够了,其余的都托管给相应环境下的配置中心:
dubbo
application
name: demo
config-center
address: nacos://127.0.0.1:8848
|