跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring Cloud Nacos 服务注册与配置中心实战

综述由AI生成Nacos 作为 Spring Cloud Alibaba 的核心组件,提供了服务注册发现与配置管理能力。详细讲解了 Nacos 的单机启动配置、服务提供者与消费者的集成流程,以及如何通过 @LoadBalanced 实现基于服务名的远程调用。内容涵盖负载均衡权重策略、集群隔离、健康检查机制(临时与非临时实例)、多环境命名空间隔离以及配置中心的优先级规则。重点解决了 Spring Cloud 新版本中 bootstrap 上下文禁用问题,并演示了配置热更新的实现方式,适合微服务架构下的实践参考。

steve发布于 2026/3/22更新于 2026/5/2115 浏览
Spring Cloud Nacos 服务注册与配置中心实战

Spring Cloud Nacos 服务注册与配置中心实战

0. 前言

本文基于以下技术栈进行讲解:

  • SpringBoot: 3.2.5
  • SpringCloud: 2023.0.3
  • SpringCloud Alibaba: 2023.0.1.0
  • Nacos: 2.2.3

1. 概述

Nacos (Dynamic Naming and Configuration Service) 是阿里巴巴开源的动态服务发现、配置管理和服务管理平台。在 Spring Cloud 体系中,它主要承担两大核心职责:服务注册与发现以及动态配置管理。

启动与基础配置

下载 Nacos 后,双击 startup.cmd 即可启动,默认端口为 8848。如果是单机模式开发,需修改配置文件中的集群模式:

set MODE="standalone"

访问控制台地址 http://127.0.0.1:8848/nacos/ 即可看到管理界面。

2. 服务注册与发现

微服务架构中,服务提供者(Provider)启动时将自身信息(IP、端口、服务名)注册到 Nacos;服务消费者(Consumer)通过查询 Nacos 获取可用实例列表,并依据负载均衡策略调用。

引入依赖

在需要注册服务的模块中添加以下依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

配置连接

在 application.yml 中指定 Nacos 服务器地址:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

启动服务后,登录 Nacos 控制台查看'服务管理',确认服务是否已注册成功。

3. 远程调用

3.1 RestTemplate 基础用法

RestTemplate 是 Spring 提供的同步 HTTP 客户端。假设我们有 order-service 和 product-service 两个微服务,订单服务需要调用商品服务获取详情。

直接硬编码 IP 的方式存在痛点:一旦服务 IP 变更或环境切换,代码必须修改。因此我们推荐使用服务名调用。

首先配置 RestTemplate Bean:

@Configuration
public class BeanConfig {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

业务层调用示例:

@Service
public class OrderService {
    private final OrderMapper orderMapper;
    private final RestTemplate restTemplate;

    @Autowired
    public OrderService(OrderMapper orderMapper, RestTemplate restTemplate) {
        this.orderMapper = orderMapper;
        this.restTemplate = restTemplate;
    }

    public OrderInfo selectOrderById(Integer id) {
        OrderInfo orderInfo = orderMapper.selectOrderById(id);
        // 硬编码 IP 方式,不推荐在生产使用
        String url = "http://127.0.0.1:9000/product/getProductById?id=" + orderInfo.getProductId();
        ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
        orderInfo.setProductInfo(productInfo);
        return orderInfo;
    }
}

3.2 结合 Nacos 实现服务发现调用

要利用 Nacos 的服务发现能力,只需将 @LoadBalanced 注解添加到 RestTemplate Bean 上,并将 URL 中的 IP 替换为服务名。

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

调用时直接使用服务名:

String url = "http://product-service/product/getProductById?id=" + orderInfo.getProductId();
ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);

此时 Nacos 会自动解析 product-service 对应的实际 IP 地址。

4. 负载均衡

Nacos 本身负责注册,负载均衡主要由客户端(如 Spring Cloud LoadBalancer)完成。默认策略(轮询、随机)可能不会读取 Nacos 实例的权重属性。

若要让 Nacos 配置的权重生效,需在消费者端开启 Nacos 负载均衡策略:

spring:
  cloud:
    loadbalancer:
      nacos:
        enabled: true

在 Nacos 控制台的'服务列表'中编辑实例,可以设置不同实例的权重值,流量将按权重分配。

5. 同集群优先访问

当服务部署在不同区域(如北京、上海)时,为了降低延迟,应优先调用同集群实例。

服务提供者配置(启动参数):

-Dspring.cloud.nacos.discovery.cluster-name=cluster-beijing

服务消费者配置(yml):

spring:
  cloud:
    nacos:
      discovery:
        cluster-name: cluster-beijing

6. 健康检查

Nacos 支持两种健康检查机制,确保调用指向健康实例:

  1. 客户端主动上报:心跳间隔 5 秒,超过 15 秒未收到心跳标记为不健康,30 秒删除。适用于临时实例(默认类型)。
  2. 服务器端反向探测:Nacos 主动探知,间隔 20 秒。适用于非临时实例。

如需将服务注册为非临时实例(持久化),可在配置中添加:

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false

注意:实例类型确定后不可随意更改,否则可能导致启动报错。若需修改,建议停止 Nacos 服务并清理 /data/protocol/raft 目录下的元数据文件后重启。

7. 环境隔离

多环境(开发、测试、生产)之间需要严格隔离,避免相互干扰。Nacos 通过 Namespace(命名空间)实现这一功能。

  1. 在 Nacos 控制台创建新的命名空间。
  2. 在应用配置中指定 namespace ID:
spring:
  cloud:
    nacos:
      discovery:
        namespace: 0bec5adc-2787-44b0-b826-e4bb48746c4e

不同命名空间下的服务互不可见,实现了物理或逻辑上的隔离。

8. 配置中心

传统配置文件修改需重启应用,且难以维护多环境配置。Nacos 配置中心支持集中管理和实时生效。

引入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

Bootstrap 引导文件

从 Spring Cloud 2020.0.0 版本起,默认禁用了 bootstrap 上下文。若需使用 Nacos 配置中心,需显式引入 bootstrap 依赖并配置 bootstrap.yml。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

bootstrap.yml 优先级高于 application.yml,用于加载配置中心地址等信息:

spring:
  application:
    name: order-service
  profiles:
    active: local
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: 0bec5adc-2787-44b0-b826-e4bb48746c4e
        file-extension: yaml
      discovery:
        server-addr: 127.0.0.1:8848
        ephemeral: true
        namespace: 0bec5adc-2787-44b0-b826-e4bb48746c4e

Data ID 与优先级

Nacos 根据规则构建 Data ID 来查找配置文件:

Data ID = ${prefix} - ${spring.profiles.active} . ${file-extension}

以 order-service 为例,会同时监听以下三个配置:

  1. order-service-local.yaml (优先级最高)
  2. order-service.yaml
  3. order-service

配合 @RefreshScope 注解,配置变更后无需重启即可生效。

配置优先级验证

可以通过 Controller 测试配置值的读取优先级:

@RestController
@RequestMapping("/config")
@RefreshScope
@Slf4j
public class NacosConfigController {
    @Value("${test.value}")
    private String value;

    @GetMapping("/getValue")
    public void getValue() {
        log.info("getValue:{}", value);
    }
}

访问接口观察日志输出,删除低优先级配置文件后再次访问,可验证高优先级配置覆盖低优先级配置的结论。

目录

  1. Spring Cloud Nacos 服务注册与配置中心实战
  2. 0. 前言
  3. 1. 概述
  4. 启动与基础配置
  5. 2. 服务注册与发现
  6. 引入依赖
  7. 配置连接
  8. 3. 远程调用
  9. 3.1 RestTemplate 基础用法
  10. 3.2 结合 Nacos 实现服务发现调用
  11. 4. 负载均衡
  12. 5. 同集群优先访问
  13. 6. 健康检查
  14. 7. 环境隔离
  15. 8. 配置中心
  16. 引入依赖
  17. Bootstrap 引导文件
  18. Data ID 与优先级
  19. 配置优先级验证
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Rust 异步编程实战:构建高性能 WebSocket 服务
  • JavaScript 变量声明:var、let、const 核心区别与实战指南
  • 前端核心面试题深度解析:从原理到实战
  • 春晚机器人刷屏,A 股板块为何高开低走?
  • 链表核心算法实战解析
  • GitNexus 核心引擎架构与实现解析
  • LLM 无法准确运算数字的底层原因分析
  • 大模型量化方法选择与效果评估指南
  • 无人机避障:Mid360+Fast-lio 感知建图+Ego-planner 运动规划
  • MCP 工具集成实战:browser-tools-mcp 配置与使用
  • AI 时代下的低代码复兴:开发民主化的新机遇
  • PostgreSQL 18 默认密码修改与安全加固指南
  • 计算机二级 MS Office 必考选择题精选及备考指南
  • VR 与 AR 技术深度解析:从原理到未来趋势
  • 知网 AIGC 检测原理与降低疑似度实战指南
  • Adobe Photoshop 25.0 Beta 更新详解:创意填充与神经网络滤镜
  • 当人人都会用AI,你靠什么脱颖而出?
  • Windows Git 安装配置指南:避坑与最佳实践 (2025 版)
  • Web 可访问性最佳实践:构建人人可用的前端界面
  • Python 网络爬虫入门指南与实战案例演示

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online