Spring Cloud Alibaba - Nacos理论口试总结-未完结

诗林  金牌会员 | 2025-1-14 22:15:15 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 586|帖子 586|积分 1758

暂时实例和永久实例

暂时实例和永久实例在 Nacos 中是一个非常非常重要的概念
之所以说它重要,重要是因为我在读源码的时间发现,暂时实例和永久实例在底层的许多实现机制是完全不同的
暂时实例

暂时实例在注册到注册中心之后仅仅只保存在服务端内部一个缓存中,不会持久化到磁盘
这个服务端内部的缓存在注册中心届一般被称为服务注册表
当服务实例出现非常大概下线之后,就会把这个服务实例从服务注册表中剔除
永久实例

永久服务实例不仅仅会存在服务注册表中,同时也会被持久化到磁盘文件中
当服务实例出现非常大概下线,Nacos 只会将服务实例的健康状态设置为不健康,并不会对将其从服务注册表中剔除
所以这个服务实例的信息你还是可以从注册中心看到,只不过处于不健康状态
为什么 Nacos 要将服务实例分为暂时实例和永久实例?

暂时实例就比力得当于业务服务,服务下线之后可以不必要在注册中心中查看到
永久实例就比力得当必要运维的服务,这种服务险些是永久存在的,比如说 MySQL、Redis 等等

当然假如你想改成永久实例,可以通过下面这个配置项来完成

  1. spring  cloud:   
  2. nacos:   
  3.    discovery:      
  4.              #ephemeral单词是临时的意思,设置成false,就是永久实例了   
  5.        ephemeral: false
复制代码
在 1.x 版本中,一个服务中可以既有暂时实例也有永久实例,服务实例是永久还是暂时是由服务实例本身决定的
但是 2.x 版本中,一个服务中的所有实例要么都是暂时的要么都是永久的,是由服务决定的,而不是具体的服务实例
所以在 2.x 可以说是暂时服务和永久服务

为什么 2.x 把暂时还是永久的属性由实例本身决定改成了由服务决定?

实在很简单,你想想,假设对一个 MySQL 服务来说,它的每个服务实例肯定都是永久的,不会出现一些是永久的,一些是暂时的环境吧
所以暂时还是永久的属性由服务本身决定实在就更加公道了
服务注册

1.x 版本的实现
在 Nacos 在 1.x 版本的时间,服务注册是通过 Http 接口实现的


2.x 版本的实现
Nacos 客户端在启动的时间,会通过 gRPC 跟服务端创建长毗连

这个毗连会不绝存在,之后客户端与服务端所有的通信都是基于这个长毗连来的
当客户端发起注册的时间,就会通过这个长毗连,将服务实例的信息发送给服务端
服务端拿到服务实例,跟 1.x 一样,也会存到服务注册表
除了注册之外,当注册的是暂时实例时,2.x 还会将服务实例信息存储到客户端中的一个缓存中,供 Redo 操作
所谓的 Redo 操作,实在就是一个补偿机制,本质是个定时任务,默认每 3s 实行一次
这个定时任务作用是,当客户端与服务端重新创建毗连时(因为一些非常原因导致毗连断开)
那么之前注册的服务实例肯定还要继承注册服务端(断开毗连服务实例就会被剔除服务注册表)
所以这个 Redo 操作一个很重要的作用就是重连之后的重新注册的作用

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

诗林

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表