Dubbo3 屬性配置

2022-03-29 16:46 更新

以屬性配置的方式來配置你的 Dubbo 應(yīng)用

Dubbo屬性配置有兩個(gè)職責(zé):

  1. 定義配置:根據(jù)屬性創(chuàng)建配置組件實(shí)例,類似SpringBoot的@ConfigurationProperties的作用。
  2. 屬性覆蓋:覆蓋已存在的配置組件實(shí)例的屬性值,類似Spring PropertyOverrideConfigurer 的作用。
一個(gè)屬性配置的例子 dubbo-spring-boot-samples
  ## application.properties
  
  # Spring boot application
  spring.application.name=dubbo-externalized-configuration-provider-sample
  
  # Base packages to scan Dubbo Component: @com.alibaba.dubbo.config.annotation.Service
  dubbo.scan.base-packages=com.alibaba.boot.dubbo.demo.provider.service
  
  # Dubbo Application
  ## The default value of dubbo.application.name is ${spring.application.name}
  ## dubbo.application.name=${spring.application.name}
  
  # Dubbo Protocol
  dubbo.protocol.name=dubbo
  dubbo.protocol.port=12345
  
  ## Dubbo Registry
  dubbo.registry.address=N/A
  
  ## service default version
  dubbo.provider.version=1.0.0

配置來源

從Dubbo支持的配置來源說起,默認(rèn)有6種配置來源:

  • JVM System Properties,JVM -D 參數(shù)
  • System environment,JVM進(jìn)程的環(huán)境變量
  • Externalized Configuration,外部化配置,從配置中心讀取
  • Application Configuration,應(yīng)用的屬性配置,從Spring應(yīng)用的Environment中提取"dubbo"打頭的屬性集
  • API / XML /注解等編程接口采集的配置可以被理解成配置來源的一種,是直接面向用戶編程的配置采集方式
  • 從classpath讀取配置文件 dubbo.properties

關(guān)于dubbo.properties屬性:

  1. 如果在 classpath 下有超過一個(gè) dubbo.properties 文件,比如,兩個(gè) jar 包都各自包含了 dubbo.properties,dubbo 將隨機(jī)選擇一個(gè)加載,并且打印錯(cuò)誤日志。
  2. Dubbo 可以自動(dòng)加載 classpath 根目錄下的 dubbo.properties,但是你同樣可以使用 JVM 參數(shù)來指定路徑:-Ddubbo.properties.file=xxx.properties。

覆蓋關(guān)系

下圖展示了配置覆蓋關(guān)系的優(yōu)先級(jí),從上到下優(yōu)先級(jí)依次降低:

覆蓋關(guān)系

請(qǐng)參考相關(guān)內(nèi)容:屬性覆蓋。

處理流程

屬性配置處理流程請(qǐng)查看 配置加載流程。

配置格式

目前Dubbo支持的所有配置都是.properties格式的,包括-D、Externalized Configuration等,.properties中的所有配置項(xiàng)遵循一種path-based的配置格式。

在Spring應(yīng)用中也可以將屬性配置放到application.yml中,其樹層次結(jié)構(gòu)的方式可讀性更好一些。

# 應(yīng)用級(jí)配置(無id)
dubbo.{config-type}.{config-item}={config-item-value}

# 實(shí)例級(jí)配置(指定id或name)
dubbo.{config-type}s.{config-id}.{config-item}={config-item-value}
dubbo.{config-type}s.{config-name}.{config-item}={config-item-value}

# 服務(wù)接口配置
dubbo.service.{interface-name}.{config-item}={config-item-value}
dubbo.reference.{interface-name}.{config-item}={config-item-value}

# 方法配置
dubbo.service.{interface-name}.{method-name}.{config-item}={config-item-value}
dubbo.reference.{interface-name}.{method-name}.{config-item}={config-item-value}

# 方法argument配置
dubbo.reference.{interface-name}.{method-name}.{argument-index}.{config-item}={config-item-value}

應(yīng)用級(jí)配置(無id)

應(yīng)用級(jí)配置的格式為:配置類型單數(shù)前綴,無id/name。

# 應(yīng)用級(jí)配置(無id)
dubbo.{config-type}.{config-item}={config-item-value}
  • 如果該類型的配置不存在任何實(shí)例時(shí),則將使用應(yīng)用級(jí)配置的屬性創(chuàng)建默認(rèn)實(shí)例。
  • 如果該類型的配置存在一個(gè)或多個(gè)實(shí)例,且沒有找到配置實(shí)例對(duì)應(yīng)的配置時(shí),則將應(yīng)用級(jí)配置的屬性用于屬性覆蓋。詳細(xì)請(qǐng)參考屬性覆蓋。
dubbo.application.name=demo-provider
dubbo.application.qos-enable=false

dubbo.registry.address=zookeeper://127.0.0.1:2181

dubbo.protocol.name=dubbo
dubbo.protocol.port=-1

實(shí)例級(jí)配置(指定id或name)

針對(duì)某個(gè)實(shí)例的屬性配置需要指定id或者name,其前綴格式為:配置類型復(fù)數(shù)前綴 + id/name。

# 實(shí)例級(jí)配置(指定id或name)
dubbo.{config-type}s.{config-id}.{config-item}={config-item-value}
dubbo.{config-type}s.{config-name}.{config-item}={config-item-value}
  • 如果不存在該id或者name的實(shí)例,則根據(jù)屬性創(chuàng)建配置組件實(shí)例。
  • 如果已存在相同id或name的實(shí)例,則提取該前綴的屬性集合用于屬性覆蓋。詳細(xì)請(qǐng)參考屬性覆蓋
  • 具體的配置復(fù)數(shù)形式請(qǐng)參考單復(fù)數(shù)配置對(duì)照表
dubbo.registries.unit1.address=zookeeper://127.0.0.1:2181
dubbo.registries.unit2.address=zookeeper://127.0.0.1:2182

dubbo.protocols.dubbo.name=dubbo
dubbo.protocols.dubbo.port=20880

dubbo.protocols.hessian.name=hessian
dubbo.protocols.hessian.port=8089

服務(wù)接口配置

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

方法配置

方法配置格式:

# 方法配置
dubbo.service.{interface-name}.{method-name}.{config-item}={config-item-value}
dubbo.reference.{interface-name}.{method-name}.{config-item}={config-item-value}

# 方法argument配置
dubbo.reference.{interface-name}.{method-name}.{argument-index}.{config-item}={config-item-value}

方法配置示例:

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

等價(jià)于XML配置:

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

參數(shù)配置

parameters參數(shù)為map對(duì)象,支持xxx.parameters=[{key:value},{key:value}]方式進(jìn)行配置。

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

傳輸層配置

triple協(xié)議采用Http2做底層通信協(xié)議,允許使用者自定義Http2的6個(gè)settings參數(shù)

配置格式如下:

# 通知對(duì)端header壓縮索引表的上限個(gè)數(shù)
dubbo.rpc.tri.header-table-size=4096

# 啟用服務(wù)端推送功能
dubbo.rpc.tri.enable-push=false

# 通知對(duì)端允許的最大并發(fā)流數(shù)
dubbo.rpc.tri.max-concurrent-streams=2147483647

# 聲明發(fā)送端的窗口大小
dubbo.rpc.tri.initial-window-size=1048576

# 設(shè)置幀的最大字節(jié)數(shù)
dubbo.rpc.tri.max-frame-size=32768

# 通知對(duì)端header未壓縮的最大字節(jié)數(shù)
dubbo.rpc.tri.max-header-list-size=8192

等價(jià)于yml配置:

dubbo:
  rpc:
    tri:
      header-table-size: 4096
      enable-push: false
      max-concurrent-streams: 2147483647
      initial-window-size: 1048576
      max-frame-size: 32768
      max-header-list-size: 8192

屬性與XML配置映射規(guī)則

可以將 xml 的 tag 名和屬性名組合起來,用 ‘.’ 分隔。每行一個(gè)屬性。

  • dubbo.application.name=foo 相當(dāng)于 <dubbo:application name="foo" />
  • dubbo.registry.address=10.20.153.10:9090 相當(dāng)于 <dubbo:registry address="10.20.153.10:9090" />

如果在 xml 配置中有超過一個(gè)的 tag,那么你可以使用 ‘id’ 進(jìn)行區(qū)分。如果你不指定id,它將作用于所有 tag。

  • dubbo.protocols.rmi.port=1099 相當(dāng)于 <dubbo:protocol id="rmi" name="rmi" port="1099" />
  • dubbo.registries.china.address=10.20.153.10:9090 相當(dāng)于 <dubbo:registry id="china" address="10.20.153.10:9090" />

屬性覆蓋

屬性覆蓋是指用配置的屬性值覆蓋config bean實(shí)例的屬性,類似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的屬性覆蓋有多個(gè)匹配格式,優(yōu)先級(jí)從高到低依次是:

#1. 指定id的實(shí)例級(jí)配置
dubbo.{config-type}s.{config-id}.{config-item}={config-item-value}

#2. 指定name的實(shí)例級(jí)配置
dubbo.{config-type}s.{config-name}.{config-item}={config-item-value}

#3. 應(yīng)用級(jí)配置(單數(shù)配置)
dubbo.{config-type}.{config-item}={config-item-value}

屬性覆蓋處理流程:

按照優(yōu)先級(jí)從高到低依次查找,如果找到此前綴開頭的屬性,則選定使用這個(gè)前綴提取屬性,忽略后面的配置。

屬性覆蓋流程

單復(fù)數(shù)配置對(duì)照表

復(fù)數(shù)配置的命名與普通單詞變復(fù)數(shù)的規(guī)則相同:

  1. 字母y結(jié)尾時(shí),去掉y,改為ies
  2. 字母s結(jié)尾時(shí),加es
  3. 其它加s
Config Type單數(shù)配置復(fù)數(shù)配置
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


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)