在 Spring Cloud 微服務生態中,Nacos 主要承擔服務發現和配置管理兩大核心角色,集成過程簡單高效,能快速解決微服務架構中的服務尋址、配置統一管理問題。以下是 step-by-step 實戰指南,覆蓋從環境準備到功能落地的全流程,兼顧開發測試與生產環境需求。
一、核心前提:環境準備
1. 版本兼容性(關鍵!避免踩坑)
Nacos 與 Spring Cloud、Spring Boot 版本必須嚴格匹配,否則會出現註冊失敗、調用超時等問題。推薦穩定組合(生產環境可用):
|
組件 |
版本 |
|
Spring Boot |
2.6.x ~ 2.7.x |
|
Spring Cloud |
2021.0.5 |
|
Spring Cloud Alibaba |
2021.0.5.0 |
|
Nacos Server |
2.3.2(穩定版) |
可參考 Nacos 官方版本説明 選擇適配版本。
2. 部署 Nacos Server(服務端)
Nacos 服務端是微服務的“註冊中心+配置中心”,開發測試用單機部署,生產用集羣部署。
(1)單機部署(Docker 方式最便捷)
# 拉取 Nacos 鏡像
docker pull nacos/nacos-server:2.3.2
# 啓動單機版(默認賬號/密碼:nacos/nacos)
docker run -d \
--name nacos-server \
-p 8848:8848 \
-e MODE=standalone \
nacos/nacos-server:2.3.2
(2)驗證啓動成功
訪問 Nacos 控制枱:http://服務器IP:8848/nacos,輸入賬號密碼 nacos/nacos 能登錄,説明服務端部署完成。
二、核心場景 1:服務發現(微服務通信基礎)
服務發現解決“微服務間如何找到對方”的問題,流程是:服務啓動時註冊到 Nacos,調用方從 Nacos 查詢目標服務地址,無需硬編碼 IP。
1. 統一依賴管理(父工程 pom.xml)
在微服務父工程中引入 Spring Cloud Alibaba 依賴管理,確保所有子服務版本一致:
<dependencyManagement>
<dependencies>
<!-- Spring Cloud 依賴管理 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba 依賴管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.5.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2. 服務提供者(被調用方)集成
以 user-service 為例,實現服務註冊到 Nacos。
(1)添加依賴(子工程 pom.xml)
<!-- Nacos 服務發現依賴 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Spring Web 依賴(提供 HTTP 接口) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
(2)配置 application.yml
spring:
application:
name: user-service # 服務名稱(調用方通過這個名稱尋址,必須唯一)
cloud:
nacos:
discovery:
server-addr: 192.168.1.100:8848 # Nacos 服務端地址
username: nacos # 控制枱登錄用户名
password: nacos # 控制枱登錄密碼
server:
port: 8081 # 服務端口
(3)啓動類註解(可選)
Spring Cloud 2020+ 版本無需額外註解,自動啓用服務發現;低版本需添加 @EnableDiscoveryClient:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// import org.springframework.cloud.client.discovery.EnableDiscoveryClient; // 低版本需添加
@SpringBootApplication
// @EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
(4)提供測試接口
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
// 供調用方查詢用户信息
@GetMapping("/user/info/{userId}")
public String getUserInfo(@PathVariable String userId) {
return "用户ID:" + userId + ",用户名:Nacos測試用户";
}
}
啓動 user-service,在 Nacos 控制枱「服務列表」中能看到 user-service 已註冊,狀態為“健康”。
3. 服務消費者(調用方)集成
以 order-service 為例,通過 Nacos 發現 user-service 並調用。推薦用 RestTemplate(簡單)或 OpenFeign(聲明式調用),本文以 RestTemplate 為例。
(1)添加依賴(子工程 pom.xml)
同服務提供者,需引入 Nacos 服務發現和 Spring Web 依賴。
(2)配置 application.yml
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: 192.168.1.100:8848
username: nacos
password: nacos
server:
port: 8082
(3)配置 RestTemplate(啓用負載均衡)
給 RestTemplate 加 @LoadBalanced 註解,支持通過服務名調用(Nacos 集成了 Ribbon 負載均衡):
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced // 關鍵:啓用負載均衡,支持服務名尋址
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
(4)調用服務提供者接口
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
public class OrderController {
@Resource
private RestTemplate restTemplate;
@GetMapping("/order/create/{userId}")
public String createOrder(@PathVariable String userId) {
// 核心:通過服務名調用(無需硬編碼 IP:端口)
String userInfo = restTemplate.getForObject(
"http://user-service/user/info/" + userId, // 服務名 + 接口路徑
String.class
);
return "訂單創建成功!關聯用户信息:" + userInfo;
}
}
4. 驗證服務調用
啓動 order-service 後,訪問 http://localhost:8082/order/create/1001,返回以下結果説明成功:
訂單創建成功!關聯用户信息:用户ID:1001,用户名:Nacos測試用户
三、核心場景 2:配置管理(統一配置中心)
Nacos 可作為配置中心,集中管理所有微服務的配置(如數據庫連接、接口地址、開關參數),支持動態刷新配置(無需重啓服務)。
1. 服務集成(以 user-service 為例)
(1)添加配置中心依賴
<!-- Nacos 配置中心依賴 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
(2)創建 bootstrap.yml(優先級高於 application.yml)
配置 Nacos 配置中心地址,用於加載配置:
spring:
application:
name: user-service # 與配置中心的“Data ID”對應
cloud:
nacos:
config:
server-addr: 192.168.1.100:8848 # Nacos 服務端地址
username: nacos
password: nacos
file-extension: yaml # 配置文件格式(yaml 或 properties)
(3)在 Nacos 控制枱添加配置
- 登錄 Nacos 控制枱,進入「配置管理 → 配置列表」,點擊「+」新建配置;
- 配置信息:
- Data ID:
user-service.yaml(格式:服務名.文件格式,與 bootstrap.yml 對應); - 配置格式:YAML;
- 配置內容(示例):
mysql:
url: jdbc:mysql://192.168.1.100:3306/user_db
username: root
password: 123456
app:
title: Nacos配置中心測試
switch: true
- 點擊「發佈」,配置生效。
(4)在服務中讀取配置
用 @Value 註解讀取配置,添加 @RefreshScope 支持動態刷新:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope // 關鍵:啓用配置動態刷新
public class ConfigController {
// 讀取 mysql 配置
@Value("${mysql.url}")
private String mysqlUrl;
// 讀取 app 配置
@Value("${app.title}")
private String appTitle;
@GetMapping("/config/test")
public String getConfig() {
return "MySQL地址:" + mysqlUrl + ",應用標題:" + appTitle;
}
}
2. 驗證動態刷新
- 訪問
http://localhost:8081/config/test,能正常返回配置內容; - 在 Nacos 控制枱修改
app.title的值(如改為“Nacos動態配置測試”),點擊「發佈」; - 無需重啓
user-service,再次訪問接口,返回結果已更新,説明動態刷新生效。
四、生產環境優化配置
1. 服務端優化(Nacos Server)
- 集羣部署:避免單點故障,至少 3 個節點,配置
cluster.conf指定集羣節點; - 存儲優化:用 MySQL 替代嵌入式數據庫(配置
SPRING_DATASOURCE_PLATFORM=mysql),支持數據持久化; - 安全加固:修改默認賬號密碼,開啓訪問控制,生產環境啓用 HTTPS。
2. 客户端優化(微服務)
- 健康檢查:默認開啓,可自定義檢查路徑和間隔:
spring:
cloud:
nacos:
discovery:
health-check-enabled: true # 啓用健康檢查
health-check-path: /actuator/health # 健康檢查接口(需引入 actuator 依賴)
- 配置緩存:Nacos 客户端會緩存配置,避免頻繁訪問配置中心,默認緩存 30 秒;
- 權重配置:在 Nacos 控制枱給服務實例設置權重,實現流量分發(權重越高,接收請求越多)。
五、常見問題排查
- 服務註冊失敗:
- 檢查 Nacos 服務端是否正常運行,
server-addr配置是否正確; - 查看服務啓動日誌,是否有“authentication failed”(用户名密碼錯誤)或“port occupied”(端口衝突)。
- 配置讀取失敗:
- 檢查 Data ID 是否與
spring.application.name + file-extension一致(如user-service.yaml); - 確認配置中心的配置已發佈,且配置格式(YAML/Properties)與
file-extension匹配。
- 動態刷新不生效:
- 未添加
@RefreshScope註解; - 配置項名稱寫錯(
@Value中的鍵與配置中心不一致)。
總結
在 Spring Cloud 生態中,Nacos 是“服務發現+配置管理”的一站式解決方案,集成成本低、功能全面。核心流程可概括為:
- 部署 Nacos Server 作為註冊中心和配置中心;
- 微服務添加 Nacos 依賴,配置服務名和 Nacos 地址,實現服務註冊;
- 調用方通過服務名(配合 RestTemplate/OpenFeign)實現服務調用;
- 利用 Nacos 配置中心集中管理配置,支持動態刷新。
掌握 Nacos 後,能大幅簡化微服務架構的運維成本,解決服務尋址、配置混亂、動態擴縮容等核心問題,是微服務落地的首選工具之一。