Spring Boot 整合 Nacos 实战教程:服务注册发现与配置中心详解

Spring Boot 整合 Nacos 教程(3000字)

一、Nacos 简介

Nacos 是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台,致力于帮助开发者更轻松地构建云原生应用。它支持多种注册中心协议(如 Dubbo、Spring Cloud、Kubernetes 等),并提供统一的配置中心功能。

Nacos 的核心功能包括:

  • 服务注册与发现:支持服务的自动注册与健康检查,便于实现服务治理。
  • 配置中心:支持配置的集中管理与动态更新,避免配置文件的重复维护。
  • 服务管理:提供服务的元数据管理、权重调整、流量控制等能力。

更多请看文章 《Windows环境下Nacos安装与部署全攻略:从零开始的详细教程》

二、开发环境准备

1. 安装 Nacos Server

你可以选择本地安装或者使用 Docker 安装 Nacos。

本地安装步骤:
  1. 下载 Nacos Server:https://github.com/alibaba/nacos/releases
  2. 解压后进入 bin 目录。
  3. 启动单机模式:
bash 复制代码
# Windows
startup.cmd -m standalone

# Linux / Mac
sh startup.sh -m standalone
  1. 访问 Nacos 控制台:http://localhost:8848/nacos,默认账号密码为 nacos/nacos
Docker 安装方式:
bash 复制代码
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 依赖如下:

xml 复制代码
<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 中添加以下配置:

yaml 复制代码
server:
  port: 8080

spring:
  application:
    name: nacos-service-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

2. 启用服务注册发现功能

在启动类上添加 @EnableDiscoveryClient 注解:

java 复制代码
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 注册中心:

yaml 复制代码
server:
  port: 8081

spring:
  application:
    name: nacos-service-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

启用服务发现:

java 复制代码
@SpringBootApplication
@EnableDiscoveryClient
public class NacosServiceConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosServiceConsumerApplication.class, args);
    }
}

注入 RestTemplate 并调用服务提供者:

java 复制代码
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 {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/call")
    public String callProvider() {
        String url = "http://nacos-service-provider/hello";
        return restTemplate.getForObject(url, String.class);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

确保服务提供者有 /hello 接口:

java 复制代码
@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
  • 配置内容:
properties 复制代码
user.config=hello nacos config

2. 配置 Spring Boot 使用 Nacos 配置中心

bootstrap.yml 中添加配置:

yaml 复制代码
spring:
  application:
    name: nacos-service-provider
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        file-extension: properties

bootstrap.yml 是在 Spring Boot 启动前加载的配置文件,用于连接配置中心。

3. 在 Spring Boot 中读取配置

创建一个配置类:

java 复制代码
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;
    }
}

创建一个控制器来展示配置内容:

java 复制代码
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 注解:

java 复制代码
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
  • Data ID:nacos-service-provider.properties
    • Group:TEST_GROUP
  • Data ID:nacos-service-provider.properties
    • Group:PROD_GROUP

2. 在 bootstrap.yml 中切换环境

yaml 复制代码
spring:
  application:
    name: nacos-service-provider
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        file-extension: properties
        group: DEV_GROUP

通过修改 group 属性切换不同环境的配置。

六、Nacos 共享配置与命名空间管理

1. 共享配置

如果你有多个微服务共享某些配置(如数据库配置),可以创建一个共享配置文件,如:

  • Data ID:shared-config.properties
  • Group:SHARED_GROUP

在 Spring Boot 中引入:

yaml 复制代码
spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        file-extension: properties
        extension-configs:
          - data-id: shared-config.properties
            group: SHARED_GROUP
            refresh: true

2. 命名空间隔离

Nacos 支持多租户管理,通过命名空间(Namespace)隔离不同环境或组织的配置与服务。

获取命名空间 ID:

  1. 登录 Nacos 控制台。
  2. 进入"命名空间"页面。
  3. 新建或查看已有命名空间的 ID。

bootstrap.yml 中配置命名空间:

yaml 复制代码
spring:
  cloud:
    nacos:
      config:
        namespace: your-namespace-id
        server-addr: localhost:8848
        file-extension: properties

七、Nacos 服务元数据与权重管理

1. 添加服务元数据

application.yml 中添加:

yaml 复制代码
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        metadata:
          version: 1.0
          region: beijing

在 Nacos 控制台的服务详情页可以查看元数据信息。

2. 调整服务权重

在 Nacos 控制台中,可以为不同实例设置不同的权重,用于控制流量分配。

八、Nacos 集群部署与高可用

在生产环境中,建议使用 Nacos 集群部署,以保证高可用性。

1. 部署多个 Nacos 节点

准备三台服务器,分别部署 Nacos,并配置集群模式。

2. 修改配置文件

在每台服务器的 application.properties 中配置集群地址:

properties 复制代码
nacos.cluster.servers=ip1:port1,ip2:port2,ip3:port3

3. 使用 MySQL 持久化数据

Nacos 默认使用嵌入式数据库存储数据,不适合生产环境。可以通过配置 MySQL 实现数据持久化。

  1. 创建数据库和表。
  2. 修改 application.properties
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 等组件,构建完整的微服务解决方案。

相关推荐
葫芦和十三2 小时前
图解 MongoDB 21|选举与 failover:Primary 是怎么选出来的
后端·mongodb·agent
GetcharZp3 小时前
26k Star 开源内网穿透神器 NetBird,一分钟实现全球设备互联!
后端
考虑考虑3 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯4 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
lizhongxuan6 小时前
多Agent之间的区别
后端
青石路8 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
杨充8 小时前
1.面向对象设计思想
后端
IT_陈寒9 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
systemPro9 小时前
2.6亿条设备数据,历史查询从超时到50ms,我做了什么
后端
要阿尔卑斯吗9 小时前
提示词优化启示:为什么“按顺序输出“比“关键度评分“更有效
后端