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

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

Spring Cloud Nacos 作为微服务核心组件,提供动态服务发现与配置管理能力。了 Nacos 的单机与集群启动方式,服务注册发现流程及负载均衡策略配置。重点讲解了如何通过 RestTemplate 结合 @LoadBalanced 实现服务名调用,替代硬编码 IP。同时涵盖了健康检查机制(临时与非临时实例)、多环境命名空间隔离方案,以及基于 bootstrap 文件的配置中心集成方法。通过实际代码示例展示了配置优先级规则与热更新效果,帮助开发者快速搭建高可用的微服务架构。

MongoKing发布于 2026/3/25更新于 2026/10/2485 浏览
Spring Cloud Nacos 微服务注册发现与配置中心实战

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

概述

Nacos (Dynamic Naming and Configuration Service) 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置和管理平台。在 Spring Cloud 体系中,Nacos 为微服务架构提供服务注册与发现以及动态配置管理能力。

环境准备

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

启动 Nacos 服务器通常双击 startup.cmd,默认端口为 8848。若需单机模式运行,可在 startup.cmd 中将 set MODE="cluster" 修改为 set MODE="standalone"。

Nacos 启动界面

服务注册与发现

服务提供者会在启动时将网络地址和服务名称注册到 Nacos 服务器,并定时发送心跳证明存活;消费者则通过查询 Nacos 获取服务列表进行调用。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

启动服务后访问 即可观察服务是否注册成功。

http://127.0.0.1:8848/nacos/#/serviceManagement

远程调用优化

RestTemplate 基础用法

在微服务间通信时,传统的 RestTemplate 需要硬编码 IP 地址。例如订单服务调用商品服务时,如果直接写死 http://127.0.0.1:9000/product/getProductById?id=...,一旦服务 IP 变更或环境切换,代码就需要修改。

@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;
    }
}

配置 RestTemplate Bean:

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

结合 Nacos 实现负载均衡

引入 spring-cloud-loadbalancer 依赖后,只需给 RestTemplate 添加 @LoadBalanced 注解,调用时直接使用服务名而非 IP,Nacos 会自动解析服务名对应的具体 IP。

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

此时 URL 可改为:

String url = "http://product-service/product/getProductById?id=" + orderInfo.getProductId();

权重与集群策略

Nacos 本身不直接提供负载均衡能力,需配合客户端负载均衡器使用。若要让 Nacos 中配置的权重生效,需在消费者配置中开启 Nacos 负载均衡策略:

spring:
  cloud:
    loadbalancer:
      nacos:
        enabled: true

在 Nacos 控制台的服务详情页编辑实例,设置权重值即可控制流量分发比例。

对于跨机房部署场景,可通过配置 cluster-name 实现同集群优先访问,减少网络延迟。例如将北京机房的实例和消费者都配置为 cluster-beijing。

健康检查机制

Nacos 确保调用始终指向健康实例,主要有两种模式:

  1. 客户端主动上报:默认临时实例采用此模式。客户端每 5 秒心跳一次,超过 15 秒未收到心跳标记为不健康,30 秒后删除。
  2. 服务器端反向探测:非临时实例采用此模式。Nacos 主动探知,间隔 20 秒,失败后标记不健康但不立即删除。

如需将服务注册为非临时实例,在配置中添加 ephemeral: false。注意实例类型确定后不可随意更改,否则可能报错,必要时需清理 Nacos 的 Raft 数据目录并重启。

环境隔离

多环境(开发、测试、生产)之间需要严格隔离。Nacos 通过 Namespace(命名空间)实现隔离,不同 Namespace 下的服务互不可见。

创建命名空间后,在配置文件中指定 namespace ID:

spring:
  cloud:
    nacos:
      discovery:
        namespace: 0bec5adc-2787-44b0-b826-e4bb48746c4e

这样,即使服务名相同,处于不同命名空间的实例也不会互相干扰。

配置中心

传统配置文件存在修改需重启、环境管理困难等痛点。Nacos 配置中心支持集中管理和实时生效。

引入依赖

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

Bootstrap 引导文件

从 Spring Cloud 2020.0.0 版本开始,默认禁用了 bootstrap 上下文。为了加载 Nacos 配置,需引入 spring-cloud-starter-bootstrap 依赖,并编写 bootstrap.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 规则

应用会根据以下公式构建 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
public class NacosConfigController {
    @Value("${test.value}")
    private String value;

    @GetMapping("/getValue")
    public void getValue() {
        System.out.println("getValue:" + value);
    }
}

访问接口查看当前生效的配置值,删除低优先级配置文件后再次访问,即可观察到配置自动回退到下一优先级的结果。

目录

  1. Spring Cloud Nacos 微服务注册发现与配置中心实战
  2. 概述
  3. 环境准备
  4. 服务注册与发现
  5. 集成步骤
  6. 远程调用优化
  7. RestTemplate 基础用法
  8. 结合 Nacos 实现负载均衡
  9. 权重与集群策略
  10. 健康检查机制
  11. 环境隔离
  12. 配置中心
  13. 引入依赖
  14. Bootstrap 引导文件
  15. Data ID 规则

更多推荐文章

查看全部
  • VS Code 前端开发高效插件推荐与配置实战
  • Telegram 群组管理机器人搭建:从零开始配置 Bot
  • Neo4j 图数据库从搭建到项目使用详解
  • 西门子 S7-1200 PLC 与爱普生机器人 Modbus TCP 通讯配置
  • Python 核心应用领域与开发环境配置详解
  • MiniMax 海螺 AI 视频:图片与文本生成高质量视频
  • C++ 二叉搜索树原理与实战:插入查找删除及 key/value 场景
  • 2026 年 3 月 AI 领域最新动态:近 7 天全球热点事件梳理
  • Vue3 Pinia Token 全流程操作指南
  • GitHub Copilot 安装与使用指南
  • VISSIM 与 Web 交互方式
  • HarmonyOS 6.0 Network Kit 深度解析:TLS 认证全面支持国密证书
  • Git 推送报错 src refspec main does not match any 解决
  • Java synchronized 底层原理:从字节码到锁升级机制
  • 鸿蒙金融理财全栈项目:风险控制、合规审计与产品创新
  • 9 篇大模型前沿论文精选:OpenELM、FlashSpeech 与 SnapKV 等
  • 多源 BFS:从单源到多源的优化思路与实战
  • Midjourney AI 图像创作指南:提示词设计与风格探索
  • 从非科班到准字节前端:开发之外的事是破局关键
  • C++11 右值引用与移动语义详解:从性能瓶颈到零拷贝优化

相关免费在线工具

  • 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