Nacos

一、Nacos 是什么(核心理解)

Nacos =

注册中心 + 配置中心

在微服务里它解决两件事:


1️⃣ 服务注册与发现

比如:

复制代码
复制代码
user-service 运行在 192.168.1.10:8081
order-service 不需要写死IP

改成:

复制代码
复制代码
order-service → Nacos → 找 user-service

2️⃣ 配置中心

统一管理配置:

复制代码
复制代码
user-service.yaml
order-service.yaml

修改后不用重启。


🧠 二、Nacos 注册中心本质(重点)

Nacos 本质是:

一个"服务信息数据库 + 心跳管理系统"

它保存的是:

复制代码
复制代码
服务名 → 实例列表(IP + port + 状态)

例如:

复制代码
复制代码
user-service:
  - 192.168.1.10:8081
  - 192.168.1.11:8081

🔁 三、Nacos 自动注册全过程(重点中的重点)

你面试必须能讲这个流程👇


🚀 1. 服务启动阶段

Spring Boot 启动:

复制代码
复制代码
UserServiceApplication 启动
↓
Spring Cloud Nacos 自动加载
↓
准备注册服务

🚀 2. 自动注册发生(关键)

Spring Cloud 做了一个事:

👉 自动帮你调用 Nacos API 注册服务

等价于:

复制代码
复制代码
POST /nacos/v1/ns/instance/register

注册内容:

复制代码
复制代码
{
  "serviceName": "user-service",
  "ip": "192.168.1.10",
  "port": 8081
}

🚀 3. Nacos 存储服务信息

Nacos 内部:

复制代码
复制代码
serviceMap
 └── user-service
       ├── instance1
       └── instance2

🚀 4. 客户端缓存服务列表

order-service 会:

复制代码
复制代码
从 Nacos 拉取 user-service 列表
缓存到本地

👉 之后调用不一定每次都查 Nacos


🚀 5. 调用流程(完整链路)

复制代码
复制代码
order-service 调用 user-service

1️⃣ 先查本地缓存
2️⃣ 没有则查 Nacos
3️⃣ 获取 IP 列表
4️⃣ 负载均衡选择一个实例
5️⃣ 发 HTTP 请求

💓 四、心跳机制(非常重要)

Nacos 会维护一个机制:

1️⃣ 服务每隔 5 秒发送心跳

复制代码
复制代码
user-service → Nacos
    "我还活着"

2️⃣ 如果超过 15 秒没心跳

复制代码
复制代码
Nacos 标记服务为:
❌ 不健康

3️⃣ 超过 30 秒

复制代码
复制代码
直接剔除服务

📌 面试一句话总结:

Nacos 通过"心跳机制"保证服务存活状态。


🧩 五、临时实例 vs 永久实例(重点)

1️⃣ 临时实例(默认)

复制代码
复制代码
ephemeral: true

特点:

  • 依赖心跳
  • 心跳断 → 立刻下线
  • 常用于 Spring Cloud 微服务

👉 ✔ 推荐使用


2️⃣ 永久实例

复制代码
复制代码
ephemeral: false

特点:

  • 不靠心跳
  • 不会自动剔除
  • 需要手动删除

📌 面试回答:

Spring Cloud 默认使用临时实例,依赖心跳机制保证健康状态。


⚙️ 六、Spring Boot 如何自动注册(重点代码)

1️⃣ 添加依赖

复制代码
复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2️⃣ 配置文件(关键)

复制代码
复制代码
spring:
  application:
    name: user-service   # 服务名(注册到Nacos的名字)

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

3️⃣ 启动类无需写注册代码

复制代码
复制代码
@SpringBootApplication
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}

❗重点:为什么不用写注册代码?

因为:

Spring Cloud Alibaba 自动帮你做了注册逻辑(SPI + Listener机制)


🧠 七、自动注册底层原理(面试加分点)

Spring Boot 启动后:

复制代码
复制代码
1️⃣ Spring Context Refresh
2️⃣ NacosAutoServiceRegistration 触发
3️⃣ 获取 applicationName
4️⃣ 获取 IP + port
5️⃣ 调用 Nacos API 注册

核心类(面试可以说)

复制代码
复制代码
NacosAutoServiceRegistration
NacosServiceRegistry
NacosNamingService

🔄 八、服务发现机制(补充理解)

1️⃣ 拉取模式

复制代码
复制代码
服务启动 → 拉取服务列表 → 缓存

2️⃣ 订阅模式(重要)

复制代码
复制代码
order-service 订阅 user-service
↓
user-service 变化
↓
Nacos 推送变更
↓
本地缓存更新

👉 这叫 Push + Pull 结合机制


⚖️ 九、Nacos vs Eureka(面试必问)

对比 Nacos Eureka
模型 AP + CP可切换 AP
功能 注册+配置 只有注册
健康检查 心跳+主动探测 心跳
推送能力 支持 不支持

🚨 十、企业真实用法(很重要)

Nacos 在公司一般这样用:

复制代码
复制代码
微服务全部注册到 Nacos
↓
Gateway 通过 Nacos 路由
↓
Feign 调用服务
↓
配置统一放 Nacos

🧾 十一、面试标准回答模板(直接背)

如果面试问:

❓ Nacos 如何实现服务注册?

你可以这样说:


👉 标准回答:

Nacos 是一个注册中心,微服务启动时会通过 Spring Cloud Alibaba 自动注册机制,将服务名、IP、端口等信息注册到 Nacos。

底层通过 NacosAutoServiceRegistration 监听 Spring 容器启动事件,调用 Nacos NamingService 完成注册。

注册成功后,服务会以"临时实例"形式存在,并通过心跳机制维持存活状态,如果心跳超时,Nacos 会自动剔除实例。

同时消费者会订阅服务列表,Nacos 会通过推送机制更新本地缓存,实现服务发现。

相关推荐
Rain的Java大神之路6 天前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
需要8266 天前
MySQL 索引 B+ 树与“查询为什么变慢了
java·spring boot·spring·spring cloud·tomcat
需要8266 天前
Arthas 一个命令排查线上问题
java·jvm·spring·spring cloud
苏渡苇7 天前
Spring Insight 里如何把 Span 画成瀑布时间线
后端·spring·spring cloud·springboot·监控·apm
叶总没有会7 天前
Nacos—注册中心
spring cloud·微服务
苏渡苇8 天前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring·spring cloud·系统监控·apm
叶总没有会8 天前
微服务--分布式基础
java·spring·spring cloud·微服务
孙启超9 天前
【AI开发之Rust】第 7 课:错误处理 —— panic、Result 与 `?`
人工智能·分布式·后端·爬虫·spring cloud·架构·rust
行百里er10 天前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring cloud·监控
砍材农夫10 天前
spring|spring web|拦截器、过滤器、aop
java·spring boot·spring·spring cloud