Spring Boot 整合 Nacos 教程(3000字)
一、Nacos 簡介
Nacos 是阿里巴巴開源的一個動態服務發現、配置管理和服務管理平臺,致力于幫助開發者更輕松地構建云原生應用。它支持多種注冊中心協議(如 Dubbo、Spring Cloud、Kubernetes 等),并提供統一的配置中心功能。
Nacos 的核心功能包括:
- 服務注冊與發現:支持服務的自動注冊與健康檢查,便于實現服務治理。
- 配置中心:支持配置的集中管理與動態更新,避免配置文件的重復維護。
- 服務管理:提供服務的元數據管理、權重調整、流量控制等能力。
更多請看文章 《Windows環境下Nacos安裝與部署全攻略:從零開始的詳細教程》
二、開發環境準備
1. 安裝 Nacos Server
你可以選擇本地安裝或者使用 Docker 安裝 Nacos。
本地安裝步驟:
- 下載 Nacos Server:https://github.com/alibaba/nacos/releases
- 解壓后進入
bin
目錄。 - 啟動單機模式:
# Windows
startup.cmd -m standalone# Linux / Mac
sh startup.sh -m standalone
- 訪問 Nacos 控制臺:
http://localhost:8848/nacos
,默認賬號密碼為nacos/nacos
。
Docker 安裝方式:
docker run -d -p 8848:8848 -p 9848:9848 nacos/nacos-server:latest
2. 創建 Spring Boot 工程
使用 Spring Initializr 或 IDE 創建 Spring Boot 項目,添加以下依賴:
- Spring Web
- Spring Cloud Alibaba Nacos Discovery
- Spring Cloud Alibaba Nacos Config
Maven 依賴如下:
<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2022.0.0.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
</dependencies>
三、Spring Boot 整合 Nacos 服務注冊與發現
1. 配置 Nacos 服務發現
在 application.yml
中添加以下配置:
server:port: 8080spring:application:name: nacos-service-providercloud:nacos:discovery:server-addr: localhost:8848
2. 啟用服務注冊發現功能
在啟動類上添加 @EnableDiscoveryClient
注解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient
public class NacosServiceProviderApplication {public static void main(String[] args) {SpringApplication.run(NacosServiceProviderApplication.class, args);}
}
3. 啟動服務并查看注冊情況
啟動服務后,訪問 Nacos 控制臺 http://localhost:8848/nacos,在“服務管理” -> “服務列表”中可以看到服務已注冊。
4. 創建服務消費者
創建一個消費者服務,同樣配置 Nacos 注冊中心:
server:port: 8081spring:application:name: nacos-service-consumercloud:nacos:discovery:server-addr: localhost:8848
啟用服務發現:
@SpringBootApplication
@EnableDiscoveryClient
public class NacosServiceConsumerApplication {public static void main(String[] args) {SpringApplication.run(NacosServiceConsumerApplication.class, args);}
}
注入 RestTemplate
并調用服務提供者:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
public class ConsumerController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/call")public String callProvider() {String url = "http://nacos-service-provider/hello";return restTemplate.getForObject(url, String.class);}@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}
確保服務提供者有 /hello
接口:
@RestController
public class ProviderController {@GetMapping("/hello")public String sayHello() {return "Hello from provider!";}
}
四、Spring Boot 整合 Nacos 配置中心
1. 創建配置文件
登錄 Nacos 控制臺,進入“配置管理” -> “配置列表”,點擊“+”號新增配置:
- Data ID:
nacos-service-provider.properties
- Group:
DEFAULT_GROUP
- 配置內容:
user.config=hello nacos config
2. 配置 Spring Boot 使用 Nacos 配置中心
在 bootstrap.yml
中添加配置:
spring:application:name: nacos-service-providercloud:nacos:config:server-addr: localhost:8848file-extension: properties
bootstrap.yml
是在 Spring Boot 啟動前加載的配置文件,用于連接配置中心。
3. 在 Spring Boot 中讀取配置
創建一個配置類:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class MyConfig {@Value("${user.config}")private String userConfig;public String getUserConfig() {return userConfig;}
}
創建一個控制器來展示配置內容:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ConfigController {private final MyConfig myConfig;public ConfigController(MyConfig myConfig) {this.myConfig = myConfig;}@GetMapping("/config")public String getConfig() {return myConfig.getUserConfig();}
}
訪問 /config
接口即可看到從 Nacos 獲取的配置值。
4. 動態刷新配置(可選)
如果你希望在不重啟服務的情況下更新配置,可以添加 @RefreshScope
注解:
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;@Component
@RefreshScope
public class MyConfig {// ...
}
五、Nacos 多環境配置管理(開發/測試/生產)
在實際項目中,我們通常需要區分不同的環境(dev、test、prod)。
1. 在 Nacos 中創建不同環境的配置文件
例如:
- Data ID:
nacos-service-provider.properties
- Group:
DEV_GROUP
- Group:
- Data ID:
nacos-service-provider.properties
- Group:
TEST_GROUP
- Group:
- Data ID:
nacos-service-provider.properties
- Group:
PROD_GROUP
- Group:
2. 在 bootstrap.yml
中切換環境
spring:application:name: nacos-service-providercloud:nacos:config:server-addr: localhost:8848file-extension: propertiesgroup: DEV_GROUP
通過修改 group
屬性切換不同環境的配置。
六、Nacos 共享配置與命名空間管理
1. 共享配置
如果你有多個微服務共享某些配置(如數據庫配置),可以創建一個共享配置文件,如:
- Data ID:
shared-config.properties
- Group:
SHARED_GROUP
在 Spring Boot 中引入:
spring:cloud:nacos:config:server-addr: localhost:8848file-extension: propertiesextension-configs:- data-id: shared-config.propertiesgroup: SHARED_GROUPrefresh: true
2. 命名空間隔離
Nacos 支持多租戶管理,通過命名空間(Namespace)隔離不同環境或組織的配置與服務。
獲取命名空間 ID:
- 登錄 Nacos 控制臺。
- 進入“命名空間”頁面。
- 新建或查看已有命名空間的 ID。
在 bootstrap.yml
中配置命名空間:
spring:cloud:nacos:config:namespace: your-namespace-idserver-addr: localhost:8848file-extension: properties
七、Nacos 服務元數據與權重管理
1. 添加服務元數據
在 application.yml
中添加:
spring:cloud:nacos:discovery:server-addr: localhost:8848metadata:version: 1.0region: beijing
在 Nacos 控制臺的服務詳情頁可以查看元數據信息。
2. 調整服務權重
在 Nacos 控制臺中,可以為不同實例設置不同的權重,用于控制流量分配。
八、Nacos 集群部署與高可用
在生產環境中,建議使用 Nacos 集群部署,以保證高可用性。
1. 部署多個 Nacos 節點
準備三臺服務器,分別部署 Nacos,并配置集群模式。
2. 修改配置文件
在每臺服務器的 application.properties
中配置集群地址:
nacos.cluster.servers=ip1:port1,ip2:port2,ip3:port3
3. 使用 MySQL 持久化數據
Nacos 默認使用嵌入式數據庫存儲數據,不適合生產環境。可以通過配置 MySQL 實現數據持久化。
- 創建數據庫和表。
- 修改
application.properties
:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456
九、常見問題與解決方案
1. 服務未注冊成功
- 檢查 Nacos 服務是否啟動。
- 檢查
server-addr
配置是否正確。 - 查看 Spring Boot 日志是否有異常。
2. 配置無法加載
- 檢查 Data ID、Group 是否匹配。
- 查看
bootstrap.yml
是否正確。 - 檢查 Nacos 控制臺中的配置是否發布。
3. 動態配置不生效
- 確保類上添加了
@RefreshScope
注解。 - 檢查是否引入了
spring-cloud-starter-config
依賴。
十、總結
本文詳細介紹了 Spring Boot 如何整合 Nacos,包括服務注冊與發現、配置中心、多環境管理、共享配置、命名空間、集群部署等內容。通過 Nacos,可以大大簡化微服務架構下的服務治理與配置管理,提升開發效率與系統穩定性。
隨著云原生的發展,Nacos 作為 Spring Cloud Alibaba 的核心組件之一,已經成為構建現代微服務系統的重要工具。建議在實際項目中結合 Spring Cloud Gateway、Sentinel、Seata 等組件,構建完整的微服務解決方案。