Nacos 開源至今已有一年,在這一年裡,得到了很多使用者的支援和回報。在與社群的交流中,我們發現有一些問題出現的頻率比較高,為了能夠讓使用者更快的解決問題,我們總結了這篇常見問題及解決方法,這篇文章後續也會合并到 Nacos 官網的 FAQ 裡。
如何依賴最新的 Nacos 用戶端?
很多使用者都是通過 Spring Cloud Alibaba 或者 Dubbo 依賴的 Nacos 用戶端,那麼 Spring Cloud Alibaba 和 Dubbo 中依賴的 Nacos 用戶端版本,往往會落後于 Nacos 最新釋出的版本。在一些情況下,使用者需要強制将 Nacos 用戶端更新到最新,此時卻往往不知道該更新哪個依賴,這裡将 Spring Cloud Alibaba 和 Dubbo 的依賴更新說明如下:
Spring Cloud Alibaba
使用者通常是配置以下Maven依賴來使用的 Nacos:
<!--Nacos Discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>[latest version]</version>
</dependency>
<!--Nacos Config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>[latest version]</version>
</dependency>
這兩個 JAR 包實際上又依賴了以下的 JAR 包:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>[a particular version]</version>
</dependency>
如果 nacos-client 更新了,對應的 spring-cloud 用戶端版本不一定也同步更新,這個時候可以采用如下的方式強制更新 nacos-client(以 nacos-discovery 為例):
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>[latest version]</version>
<excludes>
<exclude>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
</exclude>
</excludes>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>[latest version]</version>
</dependency>
Dubbo
Dubbo 也是類似的道理,使用者通常引入的是以下的依賴:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>[latest version]</version>
</dependency>
<!-- Dubbo dependency -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>[latest version]</version>
</dependency>
需要更新 Nacos 用戶端時,隻需要如下修改依賴:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>[latest version]</version>
</dependency>
用戶端 CPU 高,或者記憶體耗盡的問題
問題的現象是依賴 Nacos 用戶端的應用,在運作一段時間後出現 CPU 占用率高,記憶體占用高甚至記憶體溢出的現象,可以參考
Issue這種情況首先要做的是分析 CPU 高或者記憶體占用高的原因,常用的指令有 top、jstack、jmap、jhat 等。其中一種情況是 Nacos 用戶端執行個體在 Spring Cloud Alibaba 服務架構中被反複構造了多次,可以參考
這個問題已經得到了修複,預期會在下個 Spring Cloud Alibaba 版本中釋出。
日志列印頻繁的問題
在老的 Nacos 版本中,往往會有大量的無效日志列印,這些日志的列印會迅速占用完使用者的磁盤空間,同時也讓有效日志難以查找。目前社群回報的日志頻繁列印主要有以下幾種情況:
1、access 日志大量列印,相關 Issue 點選
這裡。
主要表現是 {nacos.home}/logs/access_log.2019-xx-xx.log 類似格式檔案名的日志大量列印,而且還不能自動清理和滾動。這個日志是 Spring Boot 提供的 Tomcat 通路日志列印,Spring Boot 在關于該日志的選項中,沒有最大保留天數或者日志大小控制的選項。是以這個日志的清理必須由應用建立 Crontab 任務來完成,或者通過以下指令關閉日志的輸出(在生産環境我們還是建議開啟該日志,以便能夠有第一現場的通路記錄):
server.tomcat.accesslog.enabled=false
2、服務端業務日志大量列印且無法動态調整日志級别。這個問題在 1.1.3 已經得到優化,可以通過 API 的方式來進行日志級别的調整,調整日志級别的方式如下:
# 調整naming子產品的naming-raft.log的級别為error:
curl -X PUT '$nacos_server:8848/nacos/v1/ns/operator/log?logName=naming-raft&logLevel=error'
# 調整config子產品的config-dump.log的級别為warn:
curl -X PUT '$nacos_server:8848/nacos/v1/cs/ops/log?logName=config-dump&logLevel=warn'
3、用戶端日志大量列印,主要有心跳日志、輪詢日志等。這個問題已經在 1.1.3 解決,請更新到 1.1.3 版本。
叢集管理頁面,Raft Term 顯示不一緻問題
在 Nacos 1.0.1 版本中,Nacos 控制台支援了顯示目前的叢集各個機器的狀态資訊。這個功能受到比較多使用者的關注,其中一個被回報的問題是清單中每個節點的叢集任期不一樣。如下圖所示,圖檔資訊來自

對于這個任期不一緻的問題,原因主要是因為擷取這個資訊的邏輯有一些問題,沒有從對應的節點上擷取叢集任期。這個問題會在下一個 Nacos 版本中修複。目前一個手動檢查叢集任期的辦法是在每個節點上執行以下指令:
curl '127.0.0.1:8848/nacos/v1/ns/raft/state'
然後在傳回資訊中查找本節點的叢集任期。因為每個節點傳回的叢集任期中,隻有目前節點的資訊是準确的,傳回的其他節點的資訊都是不準确的。
本文作者:朱鵬飛,Github ID @nkorange,Nacos 開源負責人,阿裡巴巴雲原生應用平台技術專家。