跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava

Spring Cloud Nacos 核心实战:服务注册、发现与配置中心详解

综述由AI生成Nacos 作为 Spring Cloud Alibaba 的核心组件,提供动态服务发现与配置管理功能。本文涵盖 Nacos 的启动配置、服务注册与发现机制、基于 LoadBalancer 的远程调用实现、负载均衡策略配置以及环境隔离方案。重点解析了配置中心的 Bootstrap 引导文件加载流程及优先级规则,帮助开发者构建高可用的微服务架构。

leon发布于 2026/3/21更新于 2026/5/79 浏览
Spring Cloud Nacos 核心实战:服务注册、发现与配置中心详解

Spring Cloud Nacos 核心实战

前言

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

  • Spring Boot: 3.2.5
  • Spring Cloud: 2023.0.3
  • Spring Cloud Alibaba: 2023.0.1.0
  • Nacos: 2.2.3

概述

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

启动与配置

双击 startup.cmd 即可启动,默认端口为 8848。若需单机模式运行,可在记事本中打开 startup.cmd,将 set MODE="cluster" 修改为 set MODE="standalone"。

Nacos 启动界面

下载地址可前往 GitHub Release 页面获取。

服务注册与发现

微服务架构中,服务提供者(Service Provider)会在启动时将网络地址(IP + Port)、服务名称等信息注册到 Nacos 服务器,并定时发送心跳以证明存活。服务消费者(Service Consumer)则通过查询 Nacos 获取服务地址列表,根据负载均衡策略选择一个提供者进行调用。

服务注册与发现流程

引入依赖

在模块的 pom.xml 中添加以下依赖:

<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 基础用法

本项目包含两个微服务:order-service(订单服务)和 product-service(商品服务)。当订单服务需要获取关联的商品详情时,必须调用商品服务的接口。

使用 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;
    }
}

同时需要配置 RestTemplate Bean:

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

结合 Nacos 进行远程调用

硬编码 IP 的痛点在于:一旦商品服务的 IP 变更或环境切换,代码就必须修改。利用 Nacos 的优势,调用方只需知道服务名,Nacos 负责将服务名动态解析为具体的 IP 地址。

首先引入负载均衡器依赖:

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

为 RestTemplate 添加 @LoadBalanced 注解:

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

此时,调用 URL 中的 IP 地址替换为服务名即可:

// 使用服务名代替 IP
String url = "http://product-service/product/getProductById?id=" + orderInfo.getProductId();
ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);

负载均衡

Nacos 本身不直接提供负载均衡能力,而是与客户端负载均衡器(如 Spring Cloud LoadBalancer)配合使用。由于默认策略不会读取 Nacos 实例的权重属性,我们需要开启 Nacos 的负载均衡策略。

在服务消费者 order-service 的 yml 文件中添加配置:

spring:
  cloud:
    loadbalancer:
      nacos:
        enabled: true

权重配置

  1. 进入「服务管理」->「服务列表」。
  2. 点击目标服务进入详情页。
  3. 在实例列表中点击「编辑」按钮,设置「权重」值。

权重配置

同集群优先访问

在微服务部署中,为了减少跨机房调用的网络延迟和成本,通常需要实现同集群优先访问的策略。

集群配置

product-service:编辑启动配置,添加参数 -Dspring.cloud.nacos.discovery.cluster-name=cluster-beijing。

启动配置

order-service:在 yml 文件中添加如下配置:

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

健康检查

Nacos 健康检查机制确保了服务调用始终指向健康的实例,共有两种模式:

  1. 客户端主动上报机制:客户端通过心跳上报方式告知服务端健康状态,默认心跳间隔 5 秒。超过 15 秒未收到心跳将标记为不健康,超过 30 秒删除。
  2. 服务器端反向探测机制:Nacos 主动探知客户端健康状态,默认间隔 20 秒。失败后标记为不健康,但不会立即删除。

具体模式与服务实例类型强相关:

  • 临时实例:采取客户端主动上报机制(默认类型)。
  • 非临时实例:采取服务器端反向探测机制。

若要将服务修改为非临时实例,需在 yml 中添加:

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false

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

环境隔离

企业开发通常划分为开发、测试和生产环境,环境之间需要严格隔离。Nacos 提供了 namespace(命名空间)来实现隔离,不同的 namespace 的服务不可见(Nacos 默认提供了一个 public 保留空间)。

创建与配置命名空间

在控制台创建命名空间后,在应用配置中指定:

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 启动文件详解

当配置文件交由 Nacos 管理后,应用程序启动流程变为'先连接配置中心,再加载配置,最后启动应用'。bootstrap.yml 是引导配置文件,优先于 application.yml 被加载。

从 Spring Cloud 2020.0.0 版本开始,默认禁用了 bootstrap 上下文。因此需要引入 spring-cloud-starter-bootstrap 依赖来恢复该功能。

order-service 的 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 服务将从 Nacos 上读取 order-service-local.yaml 配置文件。实际启动时,会同时监听三个配置文件:

  1. order-service-local.yaml:${prefix} - ${spring.profiles.active} . ${file-extension}
  2. order-service.yaml:${prefix} . ${file-extension}
  3. order-service:${prefix}

优先级测试

通过 @RefreshScope 标注的 Controller 可以实时感知配置变化。测试优先级时,依次删除低优先级的配置文件,观察取值变化。

结论:配置文件优先级 order-service-local.yaml > order-service.yaml > order-service。

这意味着高优先级的配置会覆盖低优先级的配置,确保特定环境下的配置能正确生效。

目录

  1. Spring Cloud Nacos 核心实战
  2. 前言
  3. 概述
  4. 启动与配置
  5. 服务注册与发现
  6. 引入依赖
  7. 添加配置
  8. 远程调用
  9. RestTemplate 基础用法
  10. 结合 Nacos 进行远程调用
  11. 负载均衡
  12. 权重配置
  13. 同集群优先访问
  14. 集群配置
  15. 健康检查
  16. 环境隔离
  17. 创建与配置命名空间
  18. 配置中心
  19. 引入依赖
  20. Bootstrap 启动文件详解
  21. Data ID 规则
  22. 优先级测试
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Deepoc 具身模型:重塑采摘机器人手眼脑协同
  • 用 UI UX Pro Max 驱动现代前端 UI 工作流
  • 国产化服务器部署:银河麒麟系统搭建 Web 服务实战
  • Python 在 Windows 上的安装与 PyCharm 配置指南
  • JDK 17 安装与配置指南
  • Java 核心基础:数组、IO、泛型与并发处理
  • LeRobot 框架深度解析:架构、策略、硬件与数据流程
  • AI 小说生成器:从零打造智能写作助手
  • Win10 升级后 Copilot 弹窗烦人?彻底禁用与关闭方案
  • OpenClaw 集成飞书机器人配置指南
  • ComfyUI 节点式 AI 绘画工作流核心指南
  • Windows 10/11 下 WSL2 安装 Ubuntu 20.04 至 D 盘全流程指南
  • AgentScope-Java 配置参数详解附录 B
  • OpenClaw Java:基于 Spring Boot 的 AI Agent Gateway 全栈实践
  • Windows 11 环境下 Python 3.12.5 安装与配置实战
  • C++ 核心基础:从程序结构到内存模型
  • PEEK取代金属:精密注塑齿轮蜗杆驱动机器人灵巧手技术与成本革新
  • FastAPI:Python 高性能 Web 框架实战指南
  • Java 注解与反射实战:自定义日志与参数校验注解
  • Stable Diffusion 写真生成完整教程

相关免费在线工具

  • 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