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

相关推荐
小郎君6583 天前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·spring cloud
jktantan3 天前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·后端·算法·spring cloud·系统架构
胡写代码5 天前
把数据库连接搬进配置中心,服务起不来:spring.config.import 的 4 个必填项
spring cloud·微服务
SL_staff6 天前
私有化低代码不是减配版开发:JVS双模式建模如何重建IT交付信任
java·低代码·spring cloud
SL_staff7 天前
JVS-APS的7个刚性约束设计:从无限产能幻觉到可执行排产的工程实践
java·spring cloud·全栈
逃逸线LOF7 天前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
code_slave(码畜)8 天前
微服务架构落地:慢 SQL 治理与连接池调优 —— 守住数据库的最后一道防线
数据库·spring boot·sql·spring cloud·微服务·架构
2501_933923259 天前
SpringCloud:OpenFeign快速实现
java·后端·spring cloud·openfeign
逃逸线LOF10 天前
为什么需要Actuator进行静态检查
spring cloud·eureka
水无痕simon10 天前
3、工程重构
java·spring cloud·重构