当前位置: 首页 > news >正文

Nacos 服务注册为什么默认是临时实例?

做 Spring Cloud 开发的同学,对 Nacos 肯定不陌生。

大家平常写代码,配置文件里只要配好 Nacos 地址,程序一启动,服务就自动注册上去了。

但不知道大家有没有留意过一个细节:

当你把服务停掉,或者直接 Kill 进程,Nacos 控制台上的那个服务实例,很快就消失了。不是变成了红色的不健康状态,而是直接从列表里被删除了。

这在以前用 Zookeeper 或者早期 Dubbo 的时候,其实是不太一样的。那时候服务挂了,通常只是显示不健康,节点信息还会保留在那儿。

为什么 Nacos 要默认把它直接删掉呢?

临时 vs 持久

其实在 Nacos 的设计里,实例是分两种的:临时实例(Ephemeral) 和 持久实例(Persistent)。

Spring Cloud Alibaba 默认给我们的配置,就是临时实例

这两者最大的区别,在于谁来维持心跳,以及挂了之后怎么处理

临时实例(默认)

客户端(你的微服务)主动给 Nacos 发心跳,默认 5 秒一次。

如果 Nacos 一段时间(比如 30 秒)没收到心跳,它就默认你已经下线了,直接把你从服务列表里剔除

持久实例

客户端注册一次就不管了。Nacos 服务端会主动去探测这个 IP 通不通。我就在这儿,你不注销我,我就一直在。

如果探测不通,Nacos 只会把你标记为不健康,但不会删除你。这条记录会一直留在列表里。

为什么要默认选临时?

很多从传统架构转过来的同学可能会觉得:保留历史记录不好吗?持久化下来,方便我排查问题啊。

在物理机时代,这确实没问题。因为那时候 IP 是固定的,机器挂了,修好重启,IP 还是那个 IP。

但现在Docker 和 K8s的普及,环境变了。

想象一下,你的服务部署在 K8s 里:

  1. 每次发布更新,旧的 Pod 被销毁,新的 Pod 被创建。

  2. 关键点是:新 Pod 的 IP 地址通常是变的。

如果你用的是持久实例:

每次重启,Nacos 里就会多出几个不健康的旧 IP。发布几次之后,你的服务列表里就会堆积成百上千个无效的 IP 地址。

这不仅浪费存储,还会导致客户端拉取服务列表时,还得花精力去过滤那些已经不存在的节点。

所以 Nacos 默认选择临时实例,因为在云原生环境下,IP 地址是随时可能回收的资源。

服务挂了就是挂了,直接清理掉,给新 IP 腾位置,保持服务列表的干净。

深层原因:CAP 的取舍

除了 IP 变动,还有一个更核心的原因,涉及分布式系统的 CAP 理论。

持久实例(CP 模式)

因为它要求数据可靠,Nacos 内部通常走Raft 协议

Raft 是强一致性的,这意味着如果 Nacos 集群里的 Leader 挂了,需要重新选举。在选举期间,整个注册中心是不可写的。

对于高频上下线的微服务来说,因为网络抖动就导致服务注册不上,这是很难接受的。

临时实例(AP 模式)

它走的是 Nacos 自研的 Distro 协议,它的逻辑是:高可用大于强一致

即使集群之间数据还没完全同步,只要能让服务注册上来,能让别人发现你,不报错,比什么都强。

什么时候该用持久实例?

持久实例它主要适用的场景,是那些IP 不怎么变、且极其重要的基础设施,比如数据库 MySQL、Redis。

有时候我们希望把 MySQL 也注册到 Nacos 里,让微服务去发现数据库的地址。

因为数据库通常是固定的,即使它暂时挂了,我们也不希望它从列表里消失。我们希望它只是显示异常,等修好了,IP 还是那个 IP,业务能自动恢复。

说在最后

回到最初的问题:为什么默认是临时实例?

因为在现在的微服务架构里,活着比记住更重要。

微服务应用:是流动的资源,用临时实例(AP 模式)。挂了就清理,保持服务列表的有效性,别让客户端调用到死节点。

数据库/重资产:是固定的资源,用持久实例(CP 模式)。挂了保留记录,方便运维排查。

大家在 K8s 环境下用 Nacos,建议就保持默认配置,不要手动去开持久化模式,否则你的控制台里可能会留下一堆清理不掉的无效数据。

看完等于学会,点个赞吧!!!

·············END ··············

👉 欢迎加入小哈的星球,你将获得:专属的项目实战(多个项目) / 1v1 提问 /Java 学习路线 /学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《Spring AI 项目实战》正在更新中..., 基于 Spring AI + Spring Boot 3.x + JDK 21;

  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍;演示地址:http://116.62.199.48:7070/

  • 《从零手撸:前后端分离博客项目(全栈开发)》2期已完结,演示链接:http://116.62.199.48/;

  • 专栏阅读地址:https://www.quanxiaoha.com/column

截止目前,累计输出 100w+ 字,讲解图 4013+ 张,还在持续爆肝中..后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有4500+小伙伴加入

1. 我的私密学习小圈子,从0到1手撸企业实战项目~ 2. 面试官灵魂一问:MySQL 深度分页如何优化?(修订版) 3. 锁明明还没过期,为什么另一个线程能抢进去? 4. 阿里二面:什么是 MySQL 回表查询?如何避免?(修订版)

最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。 获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。
PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。 点“在看”支持小哈呀,谢谢啦
http://www.jsqmd.com/news/534814/

相关文章:

  • Pixel Fashion Atelier部署教程:Stable Diffusion像素时装工作站一键启动
  • 小红书内容采集神器XHS-Downloader:3种方式轻松获取无水印素材
  • 率零降AI工具新手教程:零基础也能快速降论文AIGC率 - 我要发一区
  • 比话降AI操作全流程教程:从上传论文到降AI率达标一步到位 - 我要发一区
  • 深入浅出Android12 SurfaceFinger:Layer创建与HWComposer的奥秘
  • Hilo游戏状态管理终极指南:从简单场景到复杂游戏架构
  • HeyGem数字人视频生成系统效果实测:口型精准同步,画面自然
  • 嘎嘎降AI使用教程:手把手教你3分钟降论文ai率到10%以下 - 我要发一区
  • 如何快速部署ChatNio:一站式AI聚合聊天平台完整指南
  • 告别PMU警告!在Vitis中为ZYNQ Boot.bin添加pmufw.elf的完整指南(2024版)
  • 打造你自己的 Webpack:基于 Minipack 的扩展开发指南
  • 扔掉特征变换和激活函数!LightGCN极简图卷积推荐模型实战(PyTorch/TensorFlow)
  • 堆学习之glibc2.31下的unsorted bin机制
  • 汽车零件分装报警系统(2)
  • SVG 写的 DICOM C-MOVE 过程展示
  • DeepSeek-OCR-2零售行业应用:商品标签识别系统实现
  • 智能车越野组硬件设计实战:基于逐飞TC264的主板与无刷驱动板DIY全记录
  • 告别Xcode项目配置冲突:XcodeGen如何重构iOS团队协作开发范式
  • Windows Server 2008 R2提权实战:用MS15-051漏洞从WebShell到System权限的完整操作记录
  • WinRAR(老牌压缩软件) v7.20 / 7.21 Beta1 x64 烈火汉化版
  • AI视觉文本技术终极指南:如何让AI看懂图片中的文字
  • Git Updater安全配置:如何保护你的访问令牌和API密钥
  • 毕业论文降AI率保姆级攻略:3步降到15%以下顺利通过检测 - 我要发一区
  • 5个维度打造你的专属音乐中心:开源音乐播放器MusicFree全解析
  • Qwen3-ASR在在线教育平台的应用:课件语音搜索系统
  • 智能客服场景落地:集成万象熔炉·丹青幻境的对话式AI助手开发
  • Halcon实战:用shape_trans算子5分钟搞定不规则区域的最小外接矩形提取
  • cleartext-mac应用场景指南:在工作和生活中如何发挥最大价值
  • 内科/外科主治备考速通:两位科室专属铭师,让提分不走弯路 - 医考机构品牌测评专家
  • MINDS-i-Common:教育机器人中的速率可控舵机框架