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

Spring Cloud Nacos 核心功能实战:服务注册与配置中心

Nacos 作为 Spring Cloud Alibaba 的核心组件,提供动态服务发现与配置管理能力。涵盖 Nacos Server 启动配置、服务注册与发现机制、基于 RestTemplate 的负载均衡调用、集群隔离策略及健康检查模式。重点解析配置中心的优先级规则与 Bootstrap 上下文加载问题,帮助开发者构建高可用的微服务架构。

芝士奶盖发布于 2026/3/15更新于 2026/10/2591 浏览
Spring Cloud Nacos 核心功能实战:服务注册与配置中心

Spring Cloud Nacos 微服务架构实践

1. 概述

Nacos (Dynamic Naming and Configuration Service) 是阿里巴巴开源的动态服务发现、配置管理平台,旨在构建云原生应用。在 Spring Cloud 体系中,它主要提供两大核心能力:服务注册与发现以及动态配置管理。

基础环境

  • 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="standalone"

![图示:Nacos 启动界面]

2. 服务注册与发现

微服务架构中,服务提供者(Provider)启动时将自身网络地址(IP + Port)和服务名称注册到 Nacos,并定时发送心跳保持存活。服务消费者(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 可查看注册状态。

3. 远程调用优化

传统 RestTemplate 痛点

直接使用硬编码 IP 调用(如 http://127.0.0.1:9000/product/...),一旦服务 IP 变更或环境切换,代码需频繁修改。

基于 Nacos 的负载均衡调用

利用 Nacos 的服务名解析能力,配合 @LoadBalanced 注解,实现服务名的动态路由。

1. 引入 LoadBalancer 依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
2. 配置 RestTemplate
@Configuration
public class BeanConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
3. 调用示例

此时 URL 中使用服务名而非 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://product-service/product/getProductById?id=" + orderInfo.getProductId();
        ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);
        orderInfo.setProductInfo(productInfo);
        return orderInfo;
    }
}

4. 负载均衡与集群

Nacos 本身不直接处理负载均衡,而是配合客户端负载均衡器(如 Spring Cloud LoadBalancer)。默认策略(轮询、随机)可能忽略 Nacos 实例权重,需显式开启:

spring:
  cloud:
    loadbalancer:
      nacos:
        enabled: true

权重配置

在 Nacos 控制台编辑服务实例,设置权重值,高权重实例将接收更多流量。

同集群优先访问

为避免跨机房调用增加延迟,可配置集群名称。例如北京机房服务均设置为 cluster-beijing:

启动参数:

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

配置文件:

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

5. 健康检查机制

Nacos 支持两种健康检查模式,取决于实例类型:

  • 临时实例(默认):采用客户端主动上报心跳。若超过 15 秒未收到心跳标记为不健康,30 秒后剔除。
  • 非临时实例:采用服务端反向探测。宕机后不会立即剔除,适合持久化服务。

如需将服务注册为非临时实例,配置如下:

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false

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

6. 环境隔离

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

创建与配置

在 Nacos 控制台创建命名空间,并在配置文件中指定 ID:

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

7. 配置中心

传统配置文件存在修改需重启、多环境维护困难等问题。Nacos 作为配置中心,支持配置集中管理与实时生效。

Bootstrap 上下文

从 Spring Cloud 2020.0.0 版本起,默认禁用 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

Data ID 规则

应用读取的配置文件的 Data ID 遵循以下公式:

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

实际启动时,系统会按优先级加载多个配置文件:

  1. ${prefix}-${profiles.active}.${extension} (最高)
  2. ${prefix}.${extension}
  3. ${prefix}

例如 order-service-local.yaml > order-service.yaml > order-service。

动态刷新

使用 @RefreshScope 标注的 Bean 会在配置变更时自动重新加载,无需重启服务。

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

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

目录

  1. Spring Cloud Nacos 微服务架构实践
  2. 1. 概述
  3. 基础环境
  4. 启动与配置
  5. 2. 服务注册与发现
  6. 依赖引入
  7. 配置文件
  8. 3. 远程调用优化
  9. 传统 RestTemplate 痛点
  10. 基于 Nacos 的负载均衡调用
  11. 1. 引入 LoadBalancer 依赖
  12. 2. 配置 RestTemplate
  13. 3. 调用示例
  14. 4. 负载均衡与集群
  15. 权重配置
  16. 同集群优先访问
  17. 5. 健康检查机制
  18. 6. 环境隔离
  19. 创建与配置
  20. 7. 配置中心
  21. Bootstrap 上下文
  22. 配置文件结构
  23. Data ID 规则
  24. 动态刷新

更多推荐文章

查看全部
  • 2025年AI行业三大机会点:智能体、实用应用与行业融合
  • 基于 Isaac Lab 的 Cartpole 平衡机器人训练与代码解析
  • Python 3.14 环境下 PyAudio 安装全指南:解决兼容性与依赖问题
  • 算法基础:分治法核心思想与经典例题解析
  • 做 AI 鸿蒙 App 后,我重构了应用逻辑
  • 学术写作中降低 AIGC 检测率的实用工具指南
  • wechat-need-web 浏览器扩展实现微信网页版访问
  • 前端文件上传处理:提升用户体验与性能优化
  • LLM 大模型:提升回答质量的关键在于提问技巧
  • Python 基础语法详解:变量、类型、运算符与输入输出
  • IntelliJ IDEA 打包 Web 项目 WAR 包及 Tomcat 部署指南
  • Spring Boot 4.0 虚拟线程时代:WebFlux 与 WebMVC 选型分析
  • C++ 算法入门:一维动态规划基础实战
  • 华为 OD 技术面试:C++ 核心考点与特性解析
  • 分布式训练框架的编程基础与 PyTorch RPC 实践
  • VS Code Copilot 实战指南:从安装到高级配置
  • LLM 微调实战:使用 Code-Llama 训练自定义代码数据集
  • 7 篇必读的大模型前沿论文精选
  • MATLAB 实现基于多目标粒子群算法(MOPSO)的无人机三维路径规划
  • OpenClaw 安全 AI 助理从零搭建实战指南

相关免费在线工具

  • 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