属性配置

以属性配置的方式来配置你的 Dubbo 应用

Dubbo属性配置有两个职责:

  1. 定义配置:根据属性创建配置组件实例,类似SpringBoot的@ConfigurationProperties的作用。
  2. 属性覆盖:覆盖已存在的配置组件实例的属性值,类似Spring PropertyOverrideConfigurer 的作用。

一个属性配置的例子 dubbo-spring-boot-samples

  1. ## application.properties
  2. # Spring boot application
  3. spring.application.name=dubbo-externalized-configuration-provider-sample
  4. # Base packages to scan Dubbo Component: @com.alibaba.dubbo.config.annotation.Service
  5. dubbo.scan.base-packages=com.alibaba.boot.dubbo.demo.provider.service
  6. # Dubbo Application
  7. ## The default value of dubbo.application.name is ${spring.application.name}
  8. ## dubbo.application.name=${spring.application.name}
  9. # Dubbo Protocol
  10. dubbo.protocol.name=dubbo
  11. dubbo.protocol.port=12345
  12. ## Dubbo Registry
  13. dubbo.registry.address=N/A
  14. ## service default version
  15. dubbo.provider.version=1.0.0

配置来源

从Dubbo支持的配置来源说起,默认有6种配置来源:

  • JVM System Properties,JVM -D 参数
  • System environment,JVM进程的环境变量
  • Externalized Configuration,外部化配置,从配置中心读取
  • Application Configuration,应用的属性配置,从Spring应用的Environment中提取”dubbo”打头的属性集
  • API / XML /注解等编程接口采集的配置可以被理解成配置来源的一种,是直接面向用户编程的配置采集方式
  • 从classpath读取配置文件 dubbo.properties

关于dubbo.properties属性:

  1. 如果在 classpath 下有超过一个 dubbo.properties 文件,比如,两个 jar 包都各自包含了 dubbo.properties,dubbo 将随机选择一个加载,并且打印错误日志。
  2. Dubbo 可以自动加载 classpath 根目录下的 dubbo.properties,但是你同样可以使用 JVM 参数来指定路径:-Ddubbo.properties.file=xxx.properties

覆盖关系

下图展示了配置覆盖关系的优先级,从上到下优先级依次降低:

覆盖关系

请参考相关内容:属性覆盖

处理流程

属性配置处理流程请查看 配置加载流程

配置格式

目前Dubbo支持的所有配置都是.properties格式的,包括-DExternalized Configuration等,.properties中的所有配置项遵循一种path-based的配置格式。

在Spring应用中也可以将属性配置放到application.yml中,其树层次结构的方式可读性更好一些。

  1. # 应用级配置(无id)
  2. dubbo.{config-type}.{config-item}={config-item-value}
  3. # 实例级配置(指定id或name)
  4. dubbo.{config-type}s.{config-id}.{config-item}={config-item-value}
  5. dubbo.{config-type}s.{config-name}.{config-item}={config-item-value}
  6. # 服务接口配置
  7. dubbo.service.{interface-name}.{config-item}={config-item-value}
  8. dubbo.reference.{interface-name}.{config-item}={config-item-value}
  9. # 方法配置
  10. dubbo.service.{interface-name}.{method-name}.{config-item}={config-item-value}
  11. dubbo.reference.{interface-name}.{method-name}.{config-item}={config-item-value}
  12. # 方法argument配置
  13. dubbo.reference.{interface-name}.{method-name}.{argument-index}.{config-item}={config-item-value}

应用级配置(无id)

应用级配置的格式为:配置类型单数前缀,无id/name。

  1. # 应用级配置(无id)
  2. dubbo.{config-type}.{config-item}={config-item-value}
  • 如果该类型的配置不存在任何实例时,则将使用应用级配置的属性创建默认实例。
  • 如果该类型的配置存在一个或多个实例,且没有找到配置实例对应的配置时,则将应用级配置的属性用于属性覆盖。详细请参考属性覆盖
  1. dubbo.application.name=demo-provider
  2. dubbo.application.qos-enable=false
  3. dubbo.registry.address=zookeeper://127.0.0.1:2181
  4. dubbo.protocol.name=dubbo
  5. dubbo.protocol.port=-1

实例级配置(指定id或name)

针对某个实例的属性配置需要指定id或者name,其前缀格式为:配置类型复数前缀 + id/name。

  1. # 实例级配置(指定id或name)
  2. dubbo.{config-type}s.{config-id}.{config-item}={config-item-value}
  3. dubbo.{config-type}s.{config-name}.{config-item}={config-item-value}
  • 如果不存在该id或者name的实例,则根据属性创建配置组件实例。
  • 如果已存在相同id或name的实例,则提取该前缀的属性集合用于属性覆盖。详细请参考属性覆盖
  • 具体的配置复数形式请参考单复数配置对照表
  1. dubbo.registries.unit1.address=zookeeper://127.0.0.1:2181
  2. dubbo.registries.unit2.address=zookeeper://127.0.0.1:2182
  3. dubbo.protocols.dubbo.name=dubbo
  4. dubbo.protocols.dubbo.port=20880
  5. dubbo.protocols.hessian.name=hessian
  6. dubbo.protocols.hessian.port=8089

服务接口配置

  1. dubbo.service.org.apache.dubbo.samples.api.DemoService.timeout=5000
  2. dubbo.reference.org.apache.dubbo.samples.api.DemoService.timeout=6000

方法配置

方法配置格式:

  1. # 方法配置
  2. dubbo.service.{interface-name}.{method-name}.{config-item}={config-item-value}
  3. dubbo.reference.{interface-name}.{method-name}.{config-item}={config-item-value}
  4. # 方法argument配置
  5. dubbo.reference.{interface-name}.{method-name}.{argument-index}.{config-item}={config-item-value}

方法配置示例:

  1. dubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.timeout=7000
  2. dubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.oninvoke=notifyService.onInvoke
  3. dubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.onreturn=notifyService.onReturn
  4. dubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.onthrow=notifyService.onThrow
  5. dubbo.reference.org.apache.dubbo.samples.api.DemoService.sayHello.0.callback=true

等价于XML配置:

  1. <dubbo:reference interface="org.apache.dubbo.samples.api.DemoService" >
  2. <dubbo:method name="sayHello" timeout="7000" oninvoke="notifyService.onInvoke"
  3. onreturn="notifyService.onReturn" onthrow="notifyService.onThrow">
  4. <dubbo:argument index="0" callback="true" />
  5. </dubbo:method>
  6. </dubbo:reference>

参数配置

parameters参数为map对象,支持xxx.parameters=[{key:value},{key:value}]方式进行配置。

  1. dubbo.application.parameters=[{item1:value1},{item2:value2}]
  2. dubbo.reference.org.apache.dubbo.samples.api.DemoService.parameters=[{item3:value3}]

传输层配置

triple协议采用Http2做底层通信协议,允许使用者自定义Http2的6个settings参数

配置格式如下:

  1. # 通知对端header压缩索引表的上限个数
  2. dubbo.rpc.tri.header-table-size=4096
  3. # 启用服务端推送功能
  4. dubbo.rpc.tri.enable-push=false
  5. # 通知对端允许的最大并发流数
  6. dubbo.rpc.tri.max-concurrent-streams=2147483647
  7. # 声明发送端的窗口大小
  8. dubbo.rpc.tri.initial-window-size=1048576
  9. # 设置帧的最大字节数
  10. dubbo.rpc.tri.max-frame-size=32768
  11. # 通知对端header未压缩的最大字节数
  12. dubbo.rpc.tri.max-header-list-size=8192

等价于yml配置:

  1. dubbo:
  2. rpc:
  3. tri:
  4. header-table-size: 4096
  5. enable-push: false
  6. max-concurrent-streams: 2147483647
  7. initial-window-size: 1048576
  8. max-frame-size: 32768
  9. max-header-list-size: 8192

属性与XML配置映射规则

可以将 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" />

属性覆盖

属性覆盖是指用配置的属性值覆盖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. #1. 指定id的实例级配置
  2. dubbo.{config-type}s.{config-id}.{config-item}={config-item-value}
  3. #2. 指定name的实例级配置
  4. dubbo.{config-type}s.{config-name}.{config-item}={config-item-value}
  5. #3. 应用级配置(单数配置)
  6. dubbo.{config-type}.{config-item}={config-item-value}

属性覆盖处理流程:

按照优先级从高到低依次查找,如果找到此前缀开头的属性,则选定使用这个前缀提取属性,忽略后面的配置。

属性覆盖流程

单复数配置对照表

复数配置的命名与普通单词变复数的规则相同:

  1. 字母y结尾时,去掉y,改为ies
  2. 字母s结尾时,加es
  3. 其它加s
Config Type单数配置复数配置
applicationdubbo.application.xxx=xxxdubbo.applications.{id}.xxx=xxx
dubbo.applications.{name}.xxx=xxx
protocoldubbo.protocol.xxx=xxxdubbo.protocols.{id}.xxx=xxx
dubbo.protocols.{name}.xxx=xxx
moduledubbo.module.xxx=xxxdubbo.modules.{id}.xxx=xxx
dubbo.modules.{name}.xxx=xxx
registrydubbo.registry.xxx=xxxdubbo.registries.{id}.xxx=xxx
monitordubbo.monitor.xxx=xxxdubbo.monitors.{id}.xxx=xxx
config-centerdubbo.config-center.xxx=xxxdubbo.config-centers.{id}.xxx=xxx
metadata-reportdubbo.metadata-report.xxx=xxxdubbo.metadata-reports.{id}.xxx=xxx
ssldubbo.ssl.xxx=xxxdubbo.ssls.{id}.xxx=xxx
metricsdubbo.metrics.xxx=xxxdubbo.metricses.{id}.xxx=xxx
providerdubbo.provider.xxx=xxxdubbo.providers.{id}.xxx=xxx
consumerdubbo.consumer.xxx=xxxdubbo.consumers.{id}.xxx=xxx
servicedubbo.service.{interfaceName}.xxx=xxx
referencedubbo.reference.{interfaceName}.xxx=xxx
methoddubbo.service.{interfaceName}.{methodName}.xxx=xxx
dubbo.reference.{interfaceName}.{methodName}.xxx=xxx
argumentdubbo.service.{interfaceName}.{methodName}.{arg-index}.xxx=xxx

最后修改 September 21, 2021: Bug fix miss mialbox (#953) (57cf51b)