一、Nacos 是什么?

Nacos 全称是 Dynamic Naming and Configuration Service,中文一般理解为:

动态服务发现、配置管理和服务管理平台。

简单说,Nacos 主要做两件事:

1. 注册中心:

用来管理微服务实例,比如订单服务、用户服务、商品服务启动后注册到 Nacos,其他服务可以通过 Nacos 找到它们。

2. 配置中心:

用来统一管理配置,比如数据库地址、Redis 地址、开关配置、限流参数等,并且支持动态刷新。

官方对 Nacos 的定位也是:帮助开发者发现、配置和管理微服务,支持服务发现、服务配置、服务元数据和流量管理等能力。

现在新版 Nacos 还在往 AI Agent 管理、MCP Registry、Prompt Registry、Skill Registry 等方向扩展,不过你目前学习微服务,重点先掌握注册中心和配置中心即可。Nacos 官网显示 2026 年 5 月已经发布了 V3.2.2,同时也提供 V2.5.2 版本。

二、为什么项目需要 Nacos?

假设你有三个服务:

user-service 用户服务
order-service 订单服务
product-service 商品服务

如果没有注册中心,订单服务调用用户服务时,可能要这样写死地址:http://localhost:8081/user/1

问题来了:

1. 用户服务部署了多个实例怎么办?
2. 用户服务 IP 变了怎么办?
3. 某个实例挂了,调用方怎么知道?
4. 服务越来越多,地址怎么维护?

所以需要一个统一的服务管理中心。

Nacos 的作用就是:

服务启动时,主动把自己注册到 Nacos。
服务调用时,先从 Nacos 获取目标服务的可用实例列表。
服务下线或宕机时,Nacos 负责感知并更新服务状态。

这样调用方不用关心具体 IP,只需要知道服务名。

例如:order-service 调用 user-service 

不再写:http://192.168.1.10:8081/user/1

而是写:http://user-service/user/1

服务名背后的真实地址由 Nacos 管理。

三、Nacos 的核心功能

1. 服务注册

服务启动时,会把自己的信息注册到 Nacos。

比如:

服务名:user-service
IP:192.168.1.10
端口:8081
集群:DEFAULT
权重:1
健康状态:UP

Nacos 控制台中就能看到这个服务。

Spring Cloud Alibaba 项目中,通常只需要引入依赖和配置:

Spring Cloud Alibaba 项目中,通常只需要引入依赖和配置:

spring:
  application:
    name: user-service

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

然后启动类加:

@SpringBootApplication
@EnableDiscoveryClient
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}

启动后,user-service 就会注册到 Nacos。

2. 服务发现

服务发现就是:一个服务想调用另一个服务时,可以从 Nacos 查询目标服务有哪些可用实例。

例如订单服务调用用户服务。

@RestController
@RequestMapping("/order")
public class OrderController {

    private final RestTemplate restTemplate;

    public OrderController(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @GetMapping("/{id}")
    public String getOrder(@PathVariable Long id) {
        String user = restTemplate.getForObject(
                "http://user-service/user/1",
                String.class
        );

        return "订单ID:" + id + ",用户信息:" + user;
    }
}

这里的:

http://user-service/user/1

user-service 不是域名,也不是 IP,而是服务名。

底层流程大概是:

order-service 发起调用
        ↓
根据 user-service 去 Nacos 获取实例列表
        ↓
拿到多个 user-service 实例
        ↓
负载均衡选择一个实例
        ↓
真正请求 192.168.x.x:8081

3. 健康检查

Nacos 不只是保存服务地址,还会判断服务是否健康。

比如 user-service 有两个实例:

user-service
    192.168.1.10:8081   健康
    192.168.1.11:8081   不健康

如果某个实例宕机,Nacos 会把它标记为不可用,调用方后续就不会再调用它。

Nacos 主要通过心跳机制判断临时实例是否存活。

4. 配置管理

Nacos 还可以作为配置中心。

以前配置写在项目里:

server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test

如果要改配置,需要:

修改配置文件
重新打包
重新部署
重启服务

用了 Nacos 配置中心后,可以把配置放到 Nacos 控制台。

服务启动时从 Nacos 拉取配置。

例如 Nacos 上配置:

user:
  level: vip

项目中读取:

@RestController
@RefreshScope
public class ConfigController {

    @Value("${user.level}")
    private String userLevel;

    @GetMapping("/config")
    public String config() {
        return userLevel;
    }
}

加了:

@RefreshScope

配置变更后,部分配置可以动态刷新,不需要重启服务。

四、Nacos 注册中心工作流程

user-serviceorder-service 为例。

1. 服务注册流程

user-service 启动
        ↓
读取 nacos server-addr 配置
        ↓
连接 Nacos Server
        ↓
上报服务名、IP、端口、元数据
        ↓
Nacos 保存服务实例信息
        ↓
控制台可以看到 user-service

例如:

spring:
  application:
    name: user-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

服务注册的关键是:

spring.application.name

它决定注册到 Nacos 里的服务名。

2. 服务发现流程

order-service 调用 user-service
        ↓
根据服务名 user-service 查询实例列表
        ↓
Nacos 返回可用实例
        ↓
本地负载均衡选择一个实例
        ↓
发起 HTTP/RPC 请求

如果 user-service 有三个实例:

192.168.1.10:8081
192.168.1.11:8081
192.168.1.12:8081

调用方不会固定调用某一个,而是通过负载均衡选择。

3. 心跳续约流程

user-service 定期发送心跳
        ↓
Nacos 更新实例最后心跳时间
        ↓
如果长期收不到心跳
        ↓
标记不健康或剔除实例

这就是为什么服务挂了之后,Nacos 控制台会发现它下线。

五、Nacos 配置中心工作流程

配置中心的流程是:

服务启动
        ↓
连接 Nacos
        ↓
根据 namespace、group、dataId 拉取配置
        ↓
加载到 Spring Environment
        ↓
项目使用 @Value 或 @ConfigurationProperties 读取配置
        ↓
Nacos 配置变更
        ↓
客户端监听到变化
        ↓
动态刷新配置

六、Nacos 配置中心的三个重要概念

Nacos 配置中心里最重要的是:

Namespace
Group
Data ID

1. Namespace:命名空间

Namespace 通常用来区分环境。

比如:

dev      开发环境
test     测试环境
prod     生产环境

不同环境的配置应该隔离。

例如:

dev 环境连接测试数据库
prod 环境连接生产数据库

所以可以这样划分:

Namespace: dev
Namespace: test
Namespace: prod

2. Group:配置分组

Group 通常用来区分项目、业务线或者配置类型。

默认是:

DEFAULT_GROUP

比如:

DEFAULT_GROUP
ORDER_GROUP
USER_GROUP
MALL_GROUP

一般项目中,如果没有特别复杂的业务隔离,使用默认分组也可以。

3. Data ID:配置文件名

Data ID 类似配置文件名。

常见写法:

user-service-dev.yml
order-service-dev.yml
application-common.yml

Spring Cloud Alibaba 中常见规则是:

${spring.application.name}-${spring.profiles.active}.${file-extension}

例如:

spring:
  application:
    name: user-service
  profiles:
    active: dev

那么对应的 Data ID 可以是:

user-service-dev.yml

七、Nacos 配置加载示例

1. bootstrap.yml 示例

老版本 Spring Cloud 项目常见写法:

spring:
  application:
    name: user-service

  profiles:
    active: dev

  cloud:
    nacos:
      server-addr: 127.0.0.1:8848

      discovery:
        server-addr: 127.0.0.1:8848

      config:
        server-addr: 127.0.0.1:8848
        file-extension: yml
        namespace: dev-namespace-id
        group: DEFAULT_GROUP

Nacos 上创建配置:

Data ID: user-service-dev.yml
Group: DEFAULT_GROUP

配置内容:

server:
  port: 8081

user:
  name: zhangsan
  level: vip

代码读取:

@RestController
@RefreshScope
@RequestMapping("/user")
public class UserController {

    @Value("${user.name}")
    private String userName;

    @Value("${user.level}")
    private String userLevel;

    @GetMapping("/config")
    public String config() {
        return userName + ":" + userLevel;
    }
}

十、Nacos 集群模式

本地学习时通常是单机模式:

startup.cmd -m standalone

或者 Linux:

startup.sh -m standalone

生产环境一般不建议单机,而是集群模式。

生产环境一般不建议单机,而是集群模式。

Nacos 官方架构文档也提到,Nacos 支持注册中心和配置中心合并部署,也支持分开部署。

常见生产结构:


Nacos Server 1
Nacos Server 2
Nacos Server 3
        ↓
MySQL

客户端配置:

spring:
  cloud:
    nacos:
      server-addr: 192.168.1.10:8848,192.168.1.11:8848,192.168.1.12:8848

为什么至少 3 个节点?

因为集群要保证高可用。

一个节点挂了,其他节点还能继续提供服务。

生产环境还需要把配置数据持久化到 MySQL。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐