本文給大家分享一個(gè)強(qiáng)大的組件Nacos
,它是微服務(wù)環(huán)境下必須要用到的組件。用了Nacos
后,再也不用擔(dān)心服務(wù)注冊(cè)和發(fā)現(xiàn)以及配置管理混亂的問(wèn)題了。
背景
Nacos 致力于幫助開(kāi)發(fā)人員發(fā)現(xiàn)、配置和管理微服務(wù),Nacos 提供了一組簡(jiǎn)單易用的特性集,快速實(shí)現(xiàn)動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置、服務(wù)元數(shù)據(jù)及流量管理。
目前主流的互聯(lián)網(wǎng)服務(wù)都是基于微服務(wù)架構(gòu)的,那服務(wù)與服務(wù)之間的交互是必不可少的,而且各個(gè)服務(wù)的上下線都是相互獨(dú)立的,而且服務(wù)的配置信息也是會(huì)動(dòng)態(tài)調(diào)整的,這就需要我們的服務(wù)更加靈活。Nacos
的出現(xiàn)就是幫助我們實(shí)現(xiàn)這些繁瑣的功能。
詳細(xì)的 Nacos
介紹和部署可以參考官方網(wǎng)站 Nacos.io
。這里只介紹一下在 SpringBoot
項(xiàng)目中如何快速接入以及接入和使用過(guò)程中可能會(huì)遇到的坑。
接入
加入依賴(lài)
- 第一步在
pom
配置文件中加入下面的依賴(lài),用于實(shí)現(xiàn)服務(wù)注冊(cè)發(fā)現(xiàn)和配置中心功能。
<!-- nacos 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
<!-- nacos 注冊(cè)發(fā)現(xiàn) -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
增加配置
- 第二步在
SpringBoot
項(xiàng)目的啟動(dòng)類(lèi)上增加如下注解@EnableDiscoveryClient
用于啟動(dòng)服務(wù)注冊(cè)發(fā)現(xiàn)功能。
- 增加配置文件,對(duì)應(yīng)的配置信息需要修改成適合自己的,為了方便管理,應(yīng)用的分組名稱(chēng),命名空間以及相關(guān)的配置都需要合理的設(shè)置。多個(gè)業(yè)務(wù)使用同一個(gè)
nacos
集群的時(shí)候,需要根據(jù)各個(gè)的業(yè)務(wù)設(shè)定各自的命名空間。所有的配置文件都需要在對(duì)應(yīng)的命名空間下設(shè)置,避免多個(gè)業(yè)務(wù)混用,另外業(yè)務(wù)需要根據(jù)用到的組件或者配置,設(shè)定獨(dú)立的配置文件,例如數(shù)據(jù)庫(kù)的配置,Redis
的配置等都需要單獨(dú)設(shè)定,這樣是為了同一個(gè)應(yīng)用其他的其他服務(wù)也可以使用,而且再有地址變更的時(shí)候可以只修改一個(gè)文件就好,不會(huì)忘記。
# 應(yīng)用服務(wù)名稱(chēng)
spring.application.name=application-name
# 應(yīng)用分組名稱(chēng)
spring.cloud.nacos.config.group=GROUP-NAME
# 配置文件的后綴名
spring.cloud.nacos.config.file-extension=properties
# nacos 對(duì)應(yīng)的命名空間,在后臺(tái)創(chuàng)建好命名空間后會(huì)自動(dòng)生成
spring.cloud.nacos.config.namespace=xxxxxxxxxxxxxxxxxxxxxxxxx
# 對(duì)應(yīng)的配置文件
# MySQL 相關(guān)配置
spring.cloud.nacos.config.ext-config[0].data-id=mysql.properties
spring.cloud.nacos.config.ext-config[0].group=GROUP-NAME
# Redis 相關(guān)配置
spring.cloud.nacos.config.ext-config[1].data-id=redis.properties
spring.cloud.nacos.config.ext-config[1].group=GROUP-NAME
# 其他配置等
spring.cloud.nacos.config.ext-config[2].data-id=other.properties
spring.cloud.nacos.config.ext-config[2].group=GROUP-NAME
# 配置中心地址,多個(gè)逗號(hào)分隔
spring.cloud.nacos.config.server-addr=xxx.xx.xx.xx:xxxx
# 服務(wù)注冊(cè)發(fā)現(xiàn)地址,多個(gè)逗號(hào)分隔
spring.cloud.nacos.discovery.server-addr=xxx.xx.xx.xx:xxxx
# 集群名稱(chēng)
spring.cloud.nacos.discovery.cluster-name=CLUSTER-NAME
- 代碼中可以使用注解
@Value()
來(lái)直接讀取 Nacos 配置中的屬性參數(shù),也可以使用@ConfigurationProperties(prefix = "spring.datasource")
讀取批量參數(shù)。
spring.cloud.nacos.config.ext-config[0].refresh=true
該參數(shù)表示是否開(kāi)啟自動(dòng)更新,根據(jù)是否需要自動(dòng)更新覺(jué)得是否配置,如果需要自動(dòng)更新,加上這個(gè)配置后還需要在需要自動(dòng)更新配置的 Bean 上面增加@RefreshScop
注解。然后對(duì)應(yīng)的 Bean 內(nèi)部的屬性就可以實(shí)現(xiàn)自動(dòng)更新了。增加了spring.cloud.nacos.config.ext-config[0].refresh=true
配置后在修改了 Nacos 中的配置過(guò)后日志會(huì)出現(xiàn)下面信息,會(huì)重新加載配置,并且輸出變更的 key 信息。
服務(wù)調(diào)用
當(dāng)所有的服務(wù)都接入 Nacos 過(guò)后,我們?cè)?Nacos 的后臺(tái)就可以看到每個(gè)服務(wù)的情況,如下圖,可以看到服務(wù)狀態(tài)。
然后我們?cè)诜?wù) A 里面如果要調(diào)用服務(wù) B 的時(shí)候,就可以直接在 FeginClient 中配置服務(wù) B 的名稱(chēng),不需要填寫(xiě) URL 了。這樣我們就不用考慮服務(wù) B 是否地址和端口會(huì)不會(huì)變。服務(wù) B 的實(shí)例增加還是減少,端口是否變了,對(duì)服務(wù) A 來(lái)說(shuō)都不關(guān)心,只要有個(gè)服務(wù)名稱(chēng)就可以了。
避坑
命名空間
Nacos 有一個(gè)默認(rèn)的名為 public
的命名空間,這個(gè)命名空間是無(wú)法刪除的,所有未指定命名空間的配置都會(huì)放在該命名空間下;同樣的 Nacos 有一個(gè)默認(rèn)的名為 DEFAULT_GROUP
的分組,在沒(méi)有指定分組名稱(chēng)的時(shí)候默認(rèn)的配置都是在該分組下。
對(duì)于我們應(yīng)用程序來(lái)說(shuō),由于很多情況下一個(gè) Nacos 集群是多個(gè)團(tuán)隊(duì)共同使用的,所以為了方便管理,我們需要根據(jù)自己的業(yè)務(wù)設(shè)置自己的命名空間,用于存放本業(yè)務(wù)的配置文件。本命名空間下的配置文件,根據(jù)各個(gè)的模塊決定是否需要重新分組。
要知道在沒(méi)有清晰的命名空間劃分的時(shí)候,要想修改一個(gè)配置的內(nèi)容,是很難受的一件事情。線上的配置調(diào)整,一個(gè)不小心就是事故。如果還是自動(dòng)更新配置的話,那連后悔的機(jī)會(huì)都沒(méi)有。
精細(xì)配置
配置文件應(yīng)該專(zhuān)一,一個(gè)配置文件就設(shè)置一個(gè)內(nèi)容,比如 MySQL
的數(shù)據(jù)源單獨(dú)一個(gè)配置,Redis
的數(shù)據(jù)源單獨(dú)一個(gè)配置,如果多個(gè) Redis
服務(wù),根據(jù)功能建議分開(kāi)配置,因?yàn)椴⒉皇撬械姆?wù)都需要每個(gè) Redis
的鏈接配置。各自的服務(wù)根據(jù)需要單獨(dú)引用對(duì)應(yīng)的配置文件即可。
將所有的配置獨(dú)立成一個(gè)配置文件方便后續(xù)修改配置,只要修改一個(gè)配置文件就好,不用擔(dān)心其他還有未修改的地方。
合理的規(guī)劃配置文件的內(nèi)容,往往很多時(shí)候可以事半功倍,極大的節(jié)約時(shí)間和減少出錯(cuò)的概率。
自動(dòng)刷新
前面介紹了如何設(shè)置配置自動(dòng)刷新,不過(guò)服務(wù)是否需要自動(dòng)更新配置,這個(gè)根據(jù)自身的業(yè)務(wù)去決定。
我這里一般不建議設(shè)置自動(dòng)更新,因?yàn)楝F(xiàn)在都是微服務(wù)部署,有時(shí)候我們上線一個(gè)新功能的時(shí)候都是灰度發(fā)布,如果配置自動(dòng)更新,再調(diào)整配置過(guò)后,全部實(shí)例都會(huì)生效,這樣會(huì)有風(fēng)險(xiǎn)。不設(shè)置自動(dòng)更新的話,我們可以單獨(dú)重啟個(gè)別實(shí)例,觀察線上情況,等穩(wěn)定了再發(fā)布所有服務(wù),這樣會(huì)安全很多。
當(dāng)然對(duì)于沒(méi)有那么多服務(wù),不需要灰度,影響不大的場(chǎng)景下,配置自動(dòng)更新會(huì)方便很多,再修改配置后不需要重啟服務(wù)。
(推薦教程:Spring Boot 那些事)
總結(jié)
Nacos
作為服務(wù)的注冊(cè)發(fā)現(xiàn)和配置的統(tǒng)一管理確實(shí)十分出色,除了能快速接入 SpringBoot
項(xiàng)目之外,其他的框架都能快速的接入,更多使用可以參考官網(wǎng)。
文章來(lái)源:公眾號(hào)--Java極客技術(shù)
以上就是W3Cschool編程獅
關(guān)于你應(yīng)該知道的 Nacos 接入和避坑指南的相關(guān)介紹了,希望對(duì)大家有所幫助。