最近項目中用到了Nacos注冊中心,所以簡單做了下研究和實踐,在這里跟大家分享一下。本文主要介紹Nacos特性,快速使用,并對Nacos配置更新做了簡單實踐應用。
Nacos屬于Spring Cloud Alibaba體系,代碼已經(jīng)開源了近兩年,中文文檔豐富,開源社區(qū)也很很活躍。

Java主流注冊中心對比

從上圖可以看出Nacos的功能強大,支持監(jiān)聽、多數(shù)據(jù)中心,Dubbo和SpringCloud集成,還可以上云。Nacos是不僅支持注冊中心還支持動態(tài)配置,是Spring Cloud注冊中心+Spring Cloud配置中心的集合體。所以Nacos在企業(yè)應用中越來越常見。
Nacos關(guān)鍵特性如下
服務發(fā)現(xiàn)和服務健康監(jiān)測
Nacos支持基于DNS和基于RPC的服務發(fā)現(xiàn)。服務提供者使用原生SDK、OpenAPI、或一個獨立的Agent TODO注冊Service后,服務消費者可以使用DNS TODO或HTTP&API查找和發(fā)現(xiàn)服務。
Nacos提供對服務的實時的健康檢查,阻止向不健康的主機或服務實例發(fā)送請求。Nacos支持傳輸層(PING或TCP)和應用層(如HTTP、MySQL、用戶自定義)的健康檢查。對于復雜的云環(huán)境和網(wǎng)絡拓撲環(huán)境中(如VPC、邊緣網(wǎng)絡等)服務的健康檢查,Nacos提供了agent上報模式和服務端主動檢測2種健康檢查模式。Nacos還提供了統(tǒng)一的健康檢查儀表盤,幫助用戶根據(jù)健康狀態(tài)管理服務的可用性及流量。
動態(tài)配置服務
動態(tài)配置服務可以以中心化、外部化和動態(tài)化的方式管理所有環(huán)境的應用配置和服務配置。
動態(tài)配置消除了配置變更時重新部署應用和服務的需要,讓配置管理變得更加高效和敏捷。
配置中心化管理讓實現(xiàn)無狀態(tài)服務變得更簡單,讓服務按需彈性擴展變得更容易。
此外,Nacos提供了一個簡潔易用的UI幫助用戶管理所有的服務和應用的配置。Nacos還提供包括配置版本跟蹤、金絲雀發(fā)布、一鍵回滾配置以及客戶端配置更新狀態(tài)跟蹤在內(nèi)的一系列開箱即用的配置管理特性,可以更安全地在生產(chǎn)環(huán)境中管理配置變更和降低配置變更帶來的風險。
動態(tài)DNS服務
動態(tài)DNS服務支持權(quán)重路由,讓開發(fā)者更容易地實現(xiàn)中間層負載均衡、更靈活的路由策略、流量控制以及數(shù)據(jù)中心內(nèi)網(wǎng)的簡單DNS解析服務。動態(tài)DNS服務還能更容易地實現(xiàn)以DNS協(xié)議為基礎(chǔ)的服務發(fā)現(xiàn),以消除耦合到廠商私有服務發(fā)現(xiàn)API上的風險。
服務及其元數(shù)據(jù)管理
Nacos能讓開發(fā)者從微服務平臺建設(shè)的視角管理數(shù)據(jù)中心的所有服務及元數(shù)據(jù),包括管理服務的描述、生命周期、服務的靜態(tài)依賴分析、服務的健康狀態(tài)、服務的流量管理、路由及安全策略、服務的SLA以及最首要的metrics統(tǒng)計數(shù)據(jù)。
附一張Nacos地圖,就是香,用就對了

Nacos快速搭建
預備環(huán)境準備
Nacos依賴Java環(huán)境來運行。如果是從代碼開始構(gòu)建并運行Nacos,還需要為此配置Maven環(huán)境,請確保是在以下版本環(huán)境中安裝使用:
- 64 bit OS,支持Linux/Unix/Mac/Windows,推薦選用Linux/Unix/Mac。
- 64 bit JDK 1.8+;下載&配置。
- Maven 3.2.x+;下載&配置。
下載源碼或者安裝包
可以從最新穩(wěn)定版本下載nacos-server-version.zip
或者
tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
啟動服務器
1、Linux/Unix/Mac:
啟動命令(standalone代表著單機模式運行,非集群模式):
sh startup.sh -m standalone
如果是ubuntu系統(tǒng),或者運行腳本報錯提示:符號找不到,可嘗試如下運行:
bash startup.sh -m standalone
2、Windows:
啟動命令(standalone代表著單機模式運行,非集群模式):
cmd startup.cmd -m standalone
服務注冊&發(fā)現(xiàn)和配置管理
服務注冊
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?
serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
服務發(fā)現(xiàn)
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?
serviceName=nacos.naming.serviceName'
發(fā)布配置
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?
dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
獲取配置
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?
dataId=nacos.cfg.dataId&group=test"
關(guān)閉服務器
1、Linux/Unix/Mac:
sh shutdown.sh
2、Windows:
cmd shutdown.cmd
或者雙擊shutdown.cmd運行文件。
SpringCloud集成
啟動了Nacos server后,就可以參考以下示例代碼,為SpringBoot應用啟動Nacos配置管理服務了。
1、添加依賴。
<dependency
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
2、在application.properties中配置Nacos server的地址:
spring:
application:
name: example
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
3、通過SpringCloud原生注解@RefreshScope實現(xiàn)配置自動更新:
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
@RequestMapping("/get")
public boolean get() {
return useLocalCache;
}
}
4、訪問http://localhost:8848/nacos用戶名密碼均是nacos
新增/修改配置然后發(fā)布

useLocalCache:false
5、然后訪問http://localhost:8080/config/get就能看到useLocalCache的變化了。
項目實踐
在我們使用Nacos的過程中,發(fā)現(xiàn)動態(tài)更新有一定的局限性,我們需要將所有nacos的配置加載到內(nèi)存中,以方便我們的使用,但是Nacos無法滿足。
我們就翻閱源碼和官方文檔,實現(xiàn)了下面這個監(jiān)聽器,實現(xiàn)了動態(tài)監(jiān)聽Nacos的配置,并且對配置進行個性化處理,代碼如下:
@Component
public class SampleListener implements ApplicationRunner {
@Autowired
private NacosConfigManager nacosConfigManager;
@Override
public void run(ApplicationArguments args) throws Exception {
nacosConfigManager.getConfigService().addListener(//在程序開始的時候添加監(jiān)聽器,監(jiān)聽Nacos動態(tài)配置更新
"example.yaml", "DEFAULT_GROUP", new Listener() {
@SneakyThrows
@Override
public void receiveConfigInfo(String configInfo) {
//當配置更新的時候該方法會收到更新。
//configInfo會把Nacos配置轉(zhuǎn)為字符串,你可以在此處進行你想要的處理,比如存到Map,或者對象中等等。
Properties properties = new Properties();
try {
properties.load(new StringReader(configInfo));
}
catch (IOException e) {
e.printStackTrace();
}
System.out.println("config changed: " + properties);
}
@Override
public Executor getExecutor() {
return null;
}
});
}
}
至此本文結(jié)束,希望看完本篇文章大家能有所收獲,沒玩過Nacos的同學可以嘗試自己動手實踐一下。如果本文有紕漏之處還希望大家踴躍指出,歡迎大家積極交流討論,謝謝。
參考文獻
《SpringCloudAlibaba微服務原理與實踐》
Nacos官方文檔:
https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html