以下是一個 Dubbo 屬性配置的例子 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 配置的作業原理進行分析,
1 配置格式
目前Dubbo支持的所有配置都是.properties格式的,包括-D、Externalized Configuration等,.properties中的所有配置項遵循一種path-based的配置格式,
在Spring應用中也可以將屬性配置放到application.yml中,其樹層次結構的方式可讀性更好一些,
# 應用級配置(無id)
dubbo.{config-type}.{config-item}={config-item-value}
# 實體級配置(指定id或name)
dubbo.{config-type}s.{config-id}.{config-item}={config-item-value}
dubbo.{config-type}s.{config-name}.{config-item}={config-item-value}
# 服務介面配置
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}
1.1 應用級配置(無id)
應用級配置的格式為:配置型別單數前綴,無id/name,
# 應用級配置(無id)
dubbo.{config-type}.{config-item}={config-item-value}
類似 application、monitor、metrics 等都屬于應用級別組件,因此僅允許配置單個實體;而 protocol、registry 等允許配置多個的組件,在僅需要進行單例配置時,可采用此節描述的格式,常見示例如下:
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
1.2 實體級配置(指定id或name)
針對某個實體的屬性配置需要指定id或者name,其前綴格式為:配置型別復數前綴 + id/name,適用于 protocol、registry 等支持多例配置的組件,
# 實體級配置(指定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的實體,則框架會基于這里列出來的屬性創建配置組件實體,
- 如果已存在相同id或name的實體,則框架會將這里的列出的屬性作為已有實體配置的補充,詳細請參考屬性覆寫,
- 具體的配置復數形式請參考單復數配置對照表
配置示例:
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
1.3 服務介面配置
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
等價于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>
1.4 引數配置
parameters引數為map物件,支持xxx.parameters=[{key:value},{key:value}]方式進行配置,
dubbo.application.parameters=[{item1:value1},{item2:value2}]
dubbo.reference.org.apache.dubbo.samples.api.DemoService.parameters=[{item3:value3}]
1.5 傳輸層配置
triple協議采用Http2做底層通信協議,允許使用者自定義Http2的6個settings引數
配置格式如下:
# 通知對端header壓縮索引表的上限個數
dubbo.rpc.tri.header-table-size=4096
# 啟用服務端推送功能
dubbo.rpc.tri.enable-push=false
# 通知對端允許的最大并發流數
dubbo.rpc.tri.max-concurrent-streams=2147483647
# 宣告發送端的視窗大小
dubbo.rpc.tri.initial-window-size=1048576
# 設定幀的最大位元組數
dubbo.rpc.tri.max-frame-size=32768
# 通知對端header未壓縮的最大位元組數
dubbo.rpc.tri.max-header-list-size=8192
等價于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
1.6 屬性與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" />
1.7 配置項單復數對照表
復數配置的命名與普通單詞變復數的規則相同:
- 字母y結尾時,去掉y,改為ies
- 字母s結尾時,加es
- 其它加s
| Config Type | 單數配置 | 復數配置 |
|---|---|---|
| application | dubbo.application.xxx=xxx | dubbo.applications.{id}.xxx=xxx dubbo.applications.{name}.xxx=xxx |
| protocol | dubbo.protocol.xxx=xxx | dubbo.protocols.{id}.xxx=xxx dubbo.protocols.{name}.xxx=xxx |
| module | dubbo.module.xxx=xxx | dubbo.modules.{id}.xxx=xxx dubbo.modules.{name}.xxx=xxx |
| registry | dubbo.registry.xxx=xxx | dubbo.registries.{id}.xxx=xxx |
| monitor | dubbo.monitor.xxx=xxx | dubbo.monitors.{id}.xxx=xxx |
| config-center | dubbo.config-center.xxx=xxx | dubbo.config-centers.{id}.xxx=xxx |
| metadata-report | dubbo.metadata-report.xxx=xxx | dubbo.metadata-reports.{id}.xxx=xxx |
| ssl | dubbo.ssl.xxx=xxx | dubbo.ssls.{id}.xxx=xxx |
| metrics | dubbo.metrics.xxx=xxx | dubbo.metricses.{id}.xxx=xxx |
| provider | dubbo.provider.xxx=xxx | dubbo.providers.{id}.xxx=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
-
優先級
外部化配置默認較本地配置有更高的優先級,因此這里配置的內容會覆寫本地配置值,關于各配置形式間的覆寫關系 有單獨一章說明, -
作用域
外部化配置有全域和應用兩個級別,全域配置是所有應用共享的,應用級配置是由每個應用自己維護且只對自身可見的,當前已支持的擴展實作有 Zookeeper、Apollo、Nacos,
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
3.3.2 自行加載外部化配置
所謂 Dubbo 對配置中心的支持,本質上就是把 .properties 從遠程拉取到本地,然后和本地的配置做一次融合,理論上只要 Dubbo 框架能拿到需要的配置就可以正常的啟動,它并不關心這些配置是自己加載到的還是應用直接塞給它的,所以Dubbo還提供了以下API,讓用戶將自己組織好的配置塞給 Dubbo 框架(配置加載的程序是用戶要完成的),這樣 Dubbo 框架就不再直接和 Apollo 或 Zookeeper 做讀取配置互動,
// 應用自行加載配置
Map<String, String> dubboConfigurations = new HashMap<>();
dubboConfigurations.put("dubbo.registry.address", "zookeeper://127.0.0.1:2181");
dubboConfigurations.put("dubbo.registry.simplified", "true");
//將組織好的配置塞給Dubbo框架
ConfigCenterConfig configCenter = new ConfigCenterConfig();
configCenter.setExternalConfig(dubboConfigurations);
歡迎在 https://github.com/apache/dubbo 給 Dubbo Star,
搜索關注官方微信公眾號:Apache Dubbo,了解更多業界最新動態,掌握大廠面試必備 Dubbo 技能
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/541528.html
標籤:Java
上一篇:Java方法
