Dubbo3 外部化配置

2022-03-29 17:30 更新

將Dubbo應(yīng)用的配置放到外部集中管理

外部化配置

外部化配置目的之一是實(shí)現(xiàn)配置的集中式管理,這部分業(yè)界已經(jīng)有很多成熟的專業(yè)配置系統(tǒng)如 Apollo, Nacos 等,Dubbo 所做的主要是保證能配合這些系統(tǒng)正常工作。

外部化配置和其他本地配置在內(nèi)容和格式上并無區(qū)別,可以簡單理解為 dubbo.properties 的外部化存儲(chǔ),配置中心更適合將一些公共配置如注冊(cè)中心、元數(shù)據(jù)中心配置等抽取以便做集中管理。

# 將注冊(cè)中心地址、元數(shù)據(jù)中心地址等配置集中管理,可以做到統(tǒng)一環(huán)境、減少開發(fā)側(cè)感知。
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
  • 優(yōu)先級(jí)外部化配置默認(rèn)較本地配置有更高的優(yōu)先級(jí),因此這里配置的內(nèi)容會(huì)覆蓋本地配置值,關(guān)于 各配置形式間的覆蓋關(guān)系 有單獨(dú)一章說明。
  • 作用域外部化配置有全局和應(yīng)用兩個(gè)級(jí)別,全局配置是所有應(yīng)用共享的,應(yīng)用級(jí)配置是由每個(gè)應(yīng)用自己維護(hù)且只對(duì)自身可見的。當(dāng)前已支持的擴(kuò)展實(shí)現(xiàn)有Zookeeper、Apollo、Nacos。

配置中心

從配置中心讀取外部化配置,可以按照下面的方法指定配置中心:

<dubbo:config-center address="zookeeper://127.0.0.1:2181"/>

或者

dubbo.config-center.address=zookeeper://127.0.0.1:2181

或者

ConfigCenterConfig configCenter = new ConfigCenterConfig();
configCenter.setAddress("zookeeper://127.0.0.1:2181");

Zookeeper

<dubbo:config-center address="zookeeper://127.0.0.1:2181"/>

默認(rèn)所有的配置都存儲(chǔ)在 /dubbo/config 節(jié)點(diǎn),具體節(jié)點(diǎn)結(jié)構(gòu)圖如下:

zk-configcenter.jpg

  • namespace,用于不同配置的環(huán)境隔離。
  • config,Dubbo約定的固定節(jié)點(diǎn),不可更改,所有配置和服務(wù)治理規(guī)則都存儲(chǔ)在此節(jié)點(diǎn)下。
  • dubbo/application,分別用來隔離全局配置、應(yīng)用級(jí)別配置:dubbo是默認(rèn)group值,application對(duì)應(yīng)應(yīng)用名
  • dubbo.properties,此節(jié)點(diǎn)的node value存儲(chǔ)具體配置內(nèi)容

Apollo

<dubbo:config-center protocol="apollo" address="127.0.0.1:2181"/>

Apollo中的一個(gè)核心概念是命名空間 - namespace(和上面zookeeper的namespace概念不同),在這里全局和應(yīng)用級(jí)別配置就是通過命名空間來區(qū)分的。

默認(rèn)情況下,Dubbo會(huì)從名叫dubbo(由于 Apollo 不支持特殊后綴 .properties )的命名空間中讀取全局配置(<dubbo:config-center namespace="your namespace">)

apollo-configcenter-dubbo.png

由于 Apollo 也默認(rèn)將會(huì)在 dubbo namespace 中存儲(chǔ)服務(wù)治理規(guī)則(如路由規(guī)則),建議通過單獨(dú)配置 group 將服務(wù)治理和配置文件托管分離開,以 XML 配置方式為例:

<dubbo namespace="governance" group ="dubbo"/>

這里,服務(wù)治理規(guī)則將存儲(chǔ)在 governance namespace,而配置文件將存儲(chǔ)在 dubbo namespace,如下圖所示: apollo-configcenter-governance-dubbo.png

關(guān)于文件配置托管,相當(dāng)于是把 dubbo.properties 配置文件的內(nèi)容存儲(chǔ)在了 Apollo 中,應(yīng)用通過關(guān)聯(lián)共享的 dubbo namespace 繼承公共配置, 應(yīng)用也可以按照 Apollo 的做法來覆蓋個(gè)別配置項(xiàng)。

Nacos

<dubbo:config-center address="nacos://127.0.0.1:8848?username=nacos&password=nacos">
</dubbo:config-center>

Nacos雖然也存在命名空間 - namespace 的概念,但在 namespace 之下,還存在 group 概念。即通過 namespace 和 group 以及 dataId 去定位一個(gè)配置項(xiàng),在不指定 namespace 的情況下,默認(rèn)使用 public 作為默認(rèn)的命名空間。

在默認(rèn)情況下,全局配置會(huì)讀取 namespace : public,dataId: dubbo.properties,group: dubbo 配置項(xiàng)中的內(nèi)容作為全局配置。應(yīng)用級(jí)別的 group 和全局級(jí)別的 group 存在一點(diǎn)差異, 應(yīng)用級(jí)別會(huì)讀取 namespace: public,dataId: dubbo.properties,group: your application name 作為應(yīng)用級(jí)別的配置。

全局: nacos-configcenter-global-properties.png

應(yīng)用級(jí)別: nacos-configcenter-application-properties.png

自己加載外部化配置

所謂 Dubbo 對(duì)配置中心的支持,本質(zhì)上就是把 .properties 從遠(yuǎn)程拉取到本地,然后和本地的配置做一次融合。理論上只要 Dubbo 框架能拿到需要的配置就可以正常的啟動(dòng),它并不關(guān)心這些配置是自己加載到的還是應(yīng)用直接塞給它的,所以Dubbo還提供了以下API,讓用戶將自己組織好的配置塞給 Dubbo 框架(配置加載的過程是用戶要完成的),這樣 Dubbo 框架就不再直接和 Apollo 或 Zookeeper 做讀取配置交互。

// 應(yīng)用自行加載配置
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);


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)