5.2.3 支持配置的動態(tài)更新
基于上面快速上手的例子,若要實現(xiàn)配置的動態(tài)更新,只需要進行如下改造:
// 注入配置文件上下文
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping(value = "/configs")
public String getConfigs(){
return applicationContext.getEnvironment().getProperty("common.name");
}
我們通過nacos控制臺更新common.name的配置值谤草,再次訪問web端點/configs蒜胖,發(fā)現(xiàn)應用程序能夠獲取到最新的配置值,說明spring-cloud-starter-alibaba-nacos-config 支持配置的動態(tài)更新。
Note 可以通過配置spring.cloud.nacos.config.refresh.enabled=false來關閉動態(tài)刷新
5.2.4 自定義 namespace與group配置
支持自定義 namespace的配置
在沒有明確指定 ${spring.cloud.nacos.config.namespace} 配置的情況下, 默認使用的是 Nacos 上 Public 這個namespace。如果需要使用自定義的命名空間撞芍,可以通過以下配置來實現(xiàn):
spring:
cloud:
nacos:
config:
namespace: b3404bc0‐d7dc‐4855‐b519‐570ed34b62d7
Note:該配置必須放在 bootstrap.yml文件中。此外 spring.cloud.nacos.config.namespace 的值是 namespace對應的 id跨扮,id 值可以在 Nacos 的控制臺獲取序无。并且在添加配置時注意不要選擇其他的 namespae,否則將會導致讀取不到正確的配置衡创。
支持自定義 Group 的配置
在沒有明確指定 ${spring.cloud.nacos.config.group} 配置的情況下帝嗡, 默認使用的是 DEFAULT_GROUP 。如果需要自定義自己的 Group璃氢,可以通過以下配置來實現(xiàn):
spring:
cloud:
nacos:
config:
group: DEVELOP_GROUP
Note:該配置必須放在 bootstrap.properties 文件中哟玷。并且在添加配置時 Group 的值一定要和spring.cloud.nacos.config.group 的配置值一致。
5.2.5 自定義擴展的 Data Id 配置
Spring Cloud Alibaba Nacos Config可支持自定義 Data Id 的配置一也。 一個完整的配置案例如下所示:
下邊我們在service2微服務下配置擴展巢寡。
spring:
application:
name: service2
cloud:
nacos:
config:
server‐addr: 127.0.0.1:8848
# config external configuration
# 1、Data Id 在默認的組 DEFAULT_GROUP,不支持配置的動態(tài)刷新
ext‐config[0]:
data‐id: ext‐config‐common01.properties
# 2椰苟、Data Id 不在默認的組抑月,不支持動態(tài)刷新
ext‐config[1]:
data‐id: ext‐config‐common02.properties
group: GLOBALE_GROUP
# 3、Data Id 既不在默認的組舆蝴,也支持動態(tài)刷新
ext‐config[2]:
data‐id: ext‐config‐common03.properties
group: REFRESH_GROUP
refresh: true
可以看到:
- 通過
spring.cloud.nacos.config.ext-config[n].data-id
的配置方式來支持多個 Data Id 的配置谦絮。 - 通過
spring.cloud.nacos.config.ext-config[n].group
的配置方式自定義 Data Id 所在的組题诵,不明確配置的話,默認是 DEFAULT_GROUP层皱。 - 通過
spring.cloud.nacos.config.ext-config[n].refresh
的配置方式來控制該 Data Id 在配置變更時性锭,是否支持應用中可動態(tài)刷新, 感知到最新的配置值叫胖。默認是不支持的草冈。
Note : spring.cloud.nacos.config.ext-config[n].data-id 的值必須帶文件擴展名,文件擴展名既可支持properties瓮增,又可以支持 yaml/yml疲陕。 此時spring.cloud.nacos.config.file-extension 的配置對自定義擴展配置的 Data Id 文件擴展名沒有影響。
通過自定義擴展的 Data Id 配置钉赁,既可以解決多個應用間配置共享的問題,又可以支持一個應用有多個配置文件携茂。
測試:
配置ext-config-common01.properties:
配置ext-config-common02.properties
配置ext-config-common03.properties
編寫測試代碼:
@GetMapping(value = "/configs2")
public String getConfigs2(){
String name = applicationContext.getEnvironment().getProperty("common.name");
String age = applicationContext.getEnvironment().getProperty("common.age");
String address = applicationContext.getEnvironment().getProperty("common.address");
String birthday= applicationContext.getEnvironment().getProperty("common.birthday");
String fullname = applicationContext.getEnvironment().getProperty("common.fullname");
return name+"+"+ age+"+"+address+"+"+ birthday+"+"+ fullname;
}
重啟應用你踩,訪問http://localhost:56011/configs2,觀察配置是否成功獲取讳苦。
輸出:
service2 config+12+beijing+1990‐1‐1+zhangsansanff
5.2.6 自定義共享 Data Id 配置
為了更加清晰的在多個應用間配置共享的 Data Id 带膜,你可以通過以下的方式來配置:
spring:
cloud:
nacos:
config:
shared‐dataids: ext‐config‐common01.properties,ext‐config‐common02.properties
refreshable‐dataids: ext‐config‐common01.properties
可以看到:
- 通過
spring.cloud.nacos.config.shared-dataids
來支持多個共享 Data Id 的配置,多個之間用逗號隔開鸳谜。 - 通過
spring.cloud.nacos.config.refreshable-dataids
來支持哪些共享配置的 Data Id 在配置變化時膝藕,應用中是否可動態(tài)刷新, 感知到最新的配置值咐扭,多個 Data Id 之間用逗號隔開芭挽。如果沒有明確配置,默認情況下所有共享配置的 Data Id 都不支持動態(tài)刷新蝗肪。
Note:通過 spring.cloud.nacos.config.shared-dataids
來支持多個共享配置的 Data Id 時袜爪, 多個共享配置間的一個優(yōu)先級的關系我們約定:按照配置出現(xiàn)的先后順序,即后面的優(yōu)先級要高于前面薛闪。
Note:通過 spring.cloud.nacos.config.shared-dataids
來配置時辛馆,Data Id 必須帶文件擴展名,文件擴展名既可支持 properties豁延,也可以支持 yaml/yml昙篙。 此時 spring.cloud.nacos.config.file-extension 的配置對自定義擴展配置的 Data Id 文件擴展名沒有影響。
Note: spring.cloud.nacos.config.refreshable-dataids
給出哪些需要支持動態(tài)刷新時诱咏,Data Id 的值也必須明確給出文件擴展名苔可。
測試輸出:
service2 config+12+beijing+null+null
為什么后邊兩個值為null?
共享DataId的配置使用默認的group即DEFAULT_GROUP,ext-config-common02.properties不屬于DEFAULT_GROUP袋狞。
共享DataId的配置相比擴展的 Data Id 配置硕蛹,它把group固定為DEFAULT_GROUP醇疼,建議使用擴展的 Data Id 配置,因為擴展的 Data Id 配置也可以實現(xiàn)共享DataId配置法焰。
5.2.7 配置的優(yōu)先級
Spring Cloud Alibaba Nacos Config 目前提供了三種配置能力從 Nacos 拉取相關的配置秧荆。
- A: 通過
spring.cloud.nacos.config.shared-dataids
支持多個共享 Data Id 的配置 - B: 通過
spring.cloud.nacos.config.ext-config[n].data-id
的方式支持多個擴展 Data Id 的配置,多個Data Id 同時配置時埃仪,他的優(yōu)先級關系是spring.cloud.nacos.config.ext-config[n].data-id 其中 n 的值越大乙濒,優(yōu)先級越高。 - C: 通過內部相關規(guī)則(應用名卵蛉、擴展名 )自動生成相關的 Data Id 配置
當三種方式共同使用時颁股,他們的一個優(yōu)先級關系是:C > B >A
測試,屏蔽共享dataId傻丝,放開ext-config甘有,如下:
spring:
application:
name: service2
cloud:
nacos:
config:
server‐addr: 127.0.0.1:8848 # 配置中心地址
file‐extension: yaml
namespace: c67e4a97‐a698‐4d6d‐9bb1‐cfac5f5b51c4 # 開發(fā)環(huán)境
group: TEST_GROUP
# shared‐dataids: ext‐config‐common01.properties,ext‐config‐common02.properties
# config external configuration
# 1、Data Id 在默認的組 DEFAULT_GROUP,不支持配置的動態(tài)刷新
ext‐config[0]:
data‐id: ext‐config‐common01.properties
# 2葡缰、Data Id 不在默認的組亏掀,不支持動態(tài)刷新
ext‐config[1]:
data‐id: ext‐config‐common02.properties
group: GLOBALE_GROUP
# 3、Data Id 既不在默認的組泛释,也支持動態(tài)刷新
ext‐config[2]:
data‐id: ext‐config‐common03.properties
group: REFRESH_GROUP
refresh: true
修改ext-config-common03.properties:
輸出:
service2 config aaa+15+beijing+1990‐1‐1+zhangsansanff
通過測試發(fā)現(xiàn)多個 Data Id 同時配置時滤愕,他的優(yōu)先級關系是spring.cloud.nacos.config.ext-config[n].data-id
其中 n 的值越大,優(yōu)先級越高怜校。
修改:service1.yaml
輸出:
service2 config aaa+25+beijing+1990‐1‐1+zhangsansanff
通過測試發(fā)現(xiàn):B和C同時存在间影,C優(yōu)先級高。
5.2.8 完全關閉配置
通過設置 spring.cloud.nacos.config.enabled = false 來完全關閉 Spring Cloud Nacos Config
5.3 Nacos集群部署
5.3.1 集群部署
3個或3個以上Nacos節(jié)點才能構成集群
(1)安裝3個以上Nacos
我們可以復制之前已經解壓好的nacos文件夾茄茁,分別命名為nacos魂贬、nacos1、nacos2
(2)配置集群配置文件
在所有nacos目錄的conf目錄下裙顽,有文件 cluster.conf.example 随橘,將其命名為 cluster.conf ,并將每行配置成ip:port锦庸。(請配置3個或3個以上節(jié)點)
# ip:port
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850
由于是單機演示机蔗,需要更改nacos/的conf目錄下application.properties中server.port,防止端口沖突甘萧。如果服務器有多個ip也要指定具體的ip地址萝嘁,如:nacos.inetutils.ip-address=127.0.0.1
例如:
server.port=8850
nacos.inetutils.ip‐address=127.0.0.1
(3)集群模式啟動
分別執(zhí)行nacos目錄的bin目錄下的startup:
startup ‐m cluster
在任意一個nacos的控制臺中,可以看到如下內容:
5.3.2 客戶端配置
所有客戶端扬卷,分別指定nacos集群中的若干節(jié)點:
spring:
application:
name: xxxx
cloud:
nacos:
config:
server‐addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850
測試牙言,使用快速上手的例子:
(1)關掉127.0.0.1:8848 nacos Leader實例,發(fā)現(xiàn)Leader被成功選舉至127.0.0.1:8850
(2)緊接著重新啟動Provider怪得,這時馬上請求consumer的/service出現(xiàn)錯誤咱枉,發(fā)現(xiàn)consumer與provider通信已經出現(xiàn)問題卑硫。但經過短暫的時間后,通信恢復蚕断。
通過測試欢伏,我們可以看到,通過以上的集群部署已經達到了高可用的效果亿乳。
5.3.3 生產環(huán)境部署建議
下圖是官方推薦的集群方案硝拧,通過域名 + VIP模式的方式來實現(xiàn)「鸺伲客戶端配置的nacos障陶,當Nacos集群遷移時,客戶端配置無需修改聊训。
至于數(shù)據庫抱究,生產環(huán)境下建議至少主備模式。通過修改${nacoshome}/conf/application.properties文件带斑,能夠使nacos擁有多個數(shù)據源鼓寺。
spring.datasource.platform=mysql
db.num=2
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&autoReconnect=true
db.url.1=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&autoReconnect=true
db.user=root
db.password=root