微服务组件之--Nacos
一、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-service 和 order-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。
更多推荐



所有评论(0)