在 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 控制枱添加配置
  1. 登錄 Nacos 控制枱,進入「配置管理 → 配置列表」,點擊「+」新建配置;
  2. 配置信息:
  • 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
  1. 點擊「發佈」,配置生效。
(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. 驗證動態刷新
  1. 訪問 http://localhost:8081/config/test,能正常返回配置內容;
  2. 在 Nacos 控制枱修改 app.title 的值(如改為“Nacos動態配置測試”),點擊「發佈」;
  3. 無需重啓 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 控制枱給服務實例設置權重,實現流量分發(權重越高,接收請求越多)。

五、常見問題排查

  1. 服務註冊失敗
  • 檢查 Nacos 服務端是否正常運行,server-addr 配置是否正確;
  • 查看服務啓動日誌,是否有“authentication failed”(用户名密碼錯誤)或“port occupied”(端口衝突)。
  1. 配置讀取失敗
  • 檢查 Data ID 是否與 spring.application.name + file-extension 一致(如 user-service.yaml);
  • 確認配置中心的配置已發佈,且配置格式(YAML/Properties)與 file-extension 匹配。
  1. 動態刷新不生效
  • 未添加 @RefreshScope 註解;
  • 配置項名稱寫錯(@Value 中的鍵與配置中心不一致)。

總結

在 Spring Cloud 生態中,Nacos 是“服務發現+配置管理”的一站式解決方案,集成成本低、功能全面。核心流程可概括為:

  1. 部署 Nacos Server 作為註冊中心和配置中心;
  2. 微服務添加 Nacos 依賴,配置服務名和 Nacos 地址,實現服務註冊;
  3. 調用方通過服務名(配合 RestTemplate/OpenFeign)實現服務調用;
  4. 利用 Nacos 配置中心集中管理配置,支持動態刷新。

掌握 Nacos 後,能大幅簡化微服務架構的運維成本,解決服務尋址、配置混亂、動態擴縮容等核心問題,是微服務落地的首選工具之一。