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

相关推荐
夏天拐跑了西瓜15 小时前
Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式
spring cloud·hystrix·微服务
重生之我是Java开发战士2 天前
【Spring Cloud】认识微服务与工程搭建
spring·spring cloud·微服务
墨着染霜华3 天前
SpringCloud Gateway线上Nginx代理后自定义下划线请求头丢失(app_name/app_version获取不到)完美解决
nginx·spring cloud·gateway
Rain的Java大神之路3 天前
高并发下的热点账户余额扣减:Redis+Lua脚本实现无锁记账
java·spring boot·redis·后端·spring cloud·缓存·lua
YOU OU3 天前
优雅实现远程调用-OpenFeign
spring cloud
YOU OU3 天前
Spring Cloud概述
后端·spring·spring cloud
随遇而安zx4 天前
SpringCloud---可观测性与监控:Actuator / Micrometer / Prometheus / Grafana 深度解析
spring cloud·grafana·prometheus
LlmCraft|大模型工程实践4 天前
08. Docker Compose 一键编排:多容器应用的指挥家
java·spring cloud·eureka
橘子编程4 天前
Java邮件发送全攻略:从入门到实战
java·开发语言·spring boot·spring·spring cloud·maven
苏渡苇4 天前
HandlerInterceptor 和 WebFilter:两套 HTTP 请求拦截
spring boot·spring·http·spring cloud