一、Dubbo 配置方式
可以采用不同的方式来配置 Dubbo 应用:配置概述
Dubbo 配置介绍
API 配置:以 API 配置的方式来配置你的 Dubbo 应用
XML 配置:以 XML 配置的方式来配置你的 Dubbo 应用
注解配置:以注解配置的方式来配置你的 Dubbo 应用
属性配置:以属性配置的方式来配置你的 Dubbo 应用
外部化配置:将 Dubbo 应用的配置放到外部集中管理
自动加载环境变量:在 Dubbo 中自动加载环境变量
二、配置组件
Dubbo 框架的配置项比较繁多,为了更好地管理各种配置,将其按照用途划分为不同的组件,最终所有配置项都会汇聚到 URL 中,传递给后续处理模块。
常用配置组件如下:
application: Dubbo应用配置
registry: 注册中心
protocol: 服务提供者RPC协议
config-center: 配置中心
metadata-report: 元数据中心
service: 服务提供者配置
reference: 远程服务引用配置
provider: service的默认配置或分组配置
consumer: reference的默认配置或分组配置
module: 模块配置
monitor: 监控配置
metrics: 指标配置
ssl: SSL/TLS配置
consumer 与 reference 的关系
reference 可以指定具体的 consumer,如果没有指定 consumer 则会自动使用全局默认的 consumer 配置。
consumer 的属性是 reference 属性的默认值,可以体现在两个地方:
-
在刷新属性(属性覆盖)时,先提取其 consumer 的属性,然后提取 reference 自身的属性覆盖上去,叠加后的属性集合作为配置来源之一。 在组装 reference 的 URL 参数时,先附加其 consumer 的属性,然后附加 reference 自身的属性。
-
可以将 consumer 组件理解为 reference 组件的虚拟分组,根据需要可以定义多个不同的 consumer,不同的 consumer 设置特定的默认值, 然后在 reference 中指定 consumer 或者将<dubbo:reference /> 标签嵌套在<dubbo:consumer />标签之中。
provider 与 service 的关系
service 可以指定具体的 provider,如果没有指定则会自动使用全局默认的 provider 配置。 provider 的属性是 service 属性的默认值,覆盖规则类似上面的 consumer 与 reference,也可以将 provider 理解为 service 的虚拟分组。
三、配置来源
1、配置来源
从 Dubbo 支持的配置来源说起,默认有 6 种配置来源:
JVM System Properties,JVM -D 参数
System environment,JVM进程的环境变量
Externalized Configuration,外部化配置,从配置中心读取
Application Configuration,应用的属性配置,从Spring应用的Environment中提取"dubbo"打头的属性集
API / XML /注解等编程接口采集的配置可以被理解成配置来源的一种,是直接面向用户编程的配置采集方式
从classpath读取配置文件 dubbo.properties
2、覆盖关系
下图展示了配置覆盖关系的优先级,从上到下优先级依次降低:
-
JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。
-
XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。
-
Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。
四、配置方式
按照驱动方式可以分为以下四种方式:
API 配置:以 Java 编码的方式组织配置,包括 Raw API 和 Bootstrap API,具体请参考API 配置。
XML 配置:以 XML 方式配置各种组件,支持与 Spring 无缝集成,具体请参考XML 配置。
Annotation 配置:以注解方式暴露服务和引用服务接口,支持与 Spring 无缝集成,具体请参考Annotation 配置。
属性配置:
-
根据属性 Key-value 生成配置组件,类似 SpringBoot 的 ConfigurationProperties,具体请参考属性配置。
-
属性配置的另外一个重要的功能特性是属性覆盖,使用外部属性的值覆盖已创建的配置组件属性。
-
如果要将属性配置放到外部的配置中心,请参考外部化配置。
除了外围驱动方式上的差异,Dubbo 的配置读取总体上遵循了以下几个原则:
-
Dubbo 支持了多层级的配置,并按预定优先级自动实现配置间的覆盖,最终所有配置汇总到数据总线 URL 后驱动后续的服务暴露、引用等流程。 -
配置格式以 Properties 为主,在配置内容上遵循约定的 path-based
的命名规范
五、配置加载流程
从上图可以看出,配置加载大概分为两个阶段:
-
第一阶段为 DubboBootstrap 初始化之前,在 Spring context 启动时解析处理 XML 配置/注解配置/Java-config 或者是执行 API 配置代码,创建 config bean 并且加入到 ConfigManager 中。 -
第二阶段为 DubboBootstrap 初始化过程,从配置中心读取外部配置,依次处理实例级属性配置和应用级属性配置,最后刷新所有配置实例的属性,也就是属性覆盖。
六、dubbo.properties 怎么写
可以将 xml 的 tag 名和属性名组合起来,用 ‘.’ 分隔。每行一个属性。
dubbo.application.name=foo 相当于 <dubbo:application name="foo" />
dubbo.registry.address=10.20.153.10:9090 相当于 <dubbo:registry address="10.20.153.10:9090" />
如果在 xml 配置中有超过一个的 tag,那么你可以使用 ‘id’ 进行区分。如果你不指定 id,它将作用于所有 tag。
dubbo.protocols.rmi.port=1099 相当于 <dubbo:protocol id="rmi" name="rmi" port="1099" />
dubbo.registries.china.address=10.20.153.10:9090 相当于 <dubbo:registry id="china" address="10.20.153.10:9090" />
dubbo.properties 示例:
# Dubbo Protocol
dubbo.protocol.name=dubbo
dubbo.protocol.port=20882