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 会通过推送机制更新本地缓存,实现服务发现。

相关推荐
地瓜伯伯9 小时前
从MESI缓存一致性协议讲透synchronized的底层
java·spring boot·spring·spring cloud·微服务·springcloud
Devin~Y9 小时前
大厂 Java 面试实录:从音视频内容社区到 AI RAG 的全链路技术设计
java·spring boot·redis·spring cloud·微服务·kafka·音视频
worilb21 小时前
Spring Cloud 学习与实践(9):Gateway + JWT 统一鉴权
学习·spring cloud·gateway
山东点狮信息科技有限公司21 小时前
企业级 MES 制造执行系统架构设计与实践
spring cloud·性能优化·系统架构·策略模式·点狮
韩小兔修媛史1 天前
SpringCloud八股文面试
spring·spring cloud·面试
shushangyun_1 天前
批发商城系统源码多少钱?2026最新报价一览
java·开发语言·人工智能·spring·spring cloud
山东点狮信息科技有限公司1 天前
点狮OA-企业级 OA 办公自动化系统架构设计与实践
spring cloud·微服务·性能优化·架构·系统架构
swordbob1 天前
Nacos vs Eureka
spring cloud·云原生·eureka
Jul1en_1 天前
【SpringCloud】SkyWalking 链路追踪知识详解及部署教程
java·后端·spring·spring cloud·skywalking
我登哥MVP1 天前
SpringCloud Alibaba 核心组件解析:服务熔断和降级
java·spring boot·后端·spring·spring cloud·java-ee·maven