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

相关推荐
小罗水1 天前
第3章 从单体项目到 Spring Cloud 微服务
spring·spring cloud·微服务
乐观的Terry3 天前
9、发布系统-Webhook自动发布
java·spring boot·spring·spring cloud·mybatis
乐观的Terry4 天前
8、发布系统-完整流水线的核心
java·spring boot·spring·spring cloud
野蛮人6号7 天前
黑马天机学堂系列问题之域名无法正常使用
java·spring cloud·天机学堂
爱学习的小可爱卢7 天前
SpringCloud——微服务实战:OpenFeign与Nacos服务调用详解
spring·spring cloud·微服务
野蛮人6号8 天前
黑马天机学堂Day01-08.搭建项目环境-本地开发部署方式——不知道nacos的密码是什么
java·spring cloud·黑马程序员·天机学堂·黑马天机学堂
dyonggan8 天前
IDEA从零搭建SpringCloud Alibaba完整工程
java·spring cloud·intellij-idea
tryxr9 天前
Spring Cloud Gateway
java·开发语言·数据库·网关·spring cloud·gateway
码农学院9 天前
建筑机械行业AI搜索优化技术方案:基于Spring Cloud微服务架构的文件管理与智能化内容推荐系统
人工智能·spring cloud·架构
Devin~Y9 天前
互联网大厂Java面试实战:Spring Boot、MyBatis、Redis、Kafka、JWT、Spring Cloud 与 AI 场景追问
java·spring boot·redis·spring cloud·kafka·mybatis·spring security