个人对Nacos理解不甚透彻,但且说出自己的思考,有错误感谢指证。
前置知识
- Nacos作为服务注册、发现中心、配置中心时,有两个端Server和Client。其中Server是负责服务注册、发现、配置,Client负责订阅服务实例列表、配置信息。
- Client存在方式是集成到服务当中,如Springboot的Nacos相关依赖引入及yml中Server信息的配置。并且client通过REST请求向Server中注册服务。
- Client端有服务实例表的本地内存缓存,Server端也有服务注册表的内存缓存。Slient端默认会30秒从server端拉取一次服务,另外Client会在拉取服务实例信息时,Server建立一个长连接,当服务注册表更新时,Server会主动推送变更通知给Client,这样客户端可以及时感知到服务注册表的变化,保持服务实例信息的实时性。
- Client会感知到Server的宕机。当Server宕机时,Client会尝试与之建立连接,如果在一定时间内无法连接成功,则认为Server不可用,并会采取相应的处理措施,例如使用本地缓存提供服务注册表。
- server服务临时实例和持久化实例
- 临时实例不会持久化到磁盘中,由client主动向server上报健康状态,默认时间间隔5秒,若server 15秒未收到心跳则标记为不健康,30秒内若又收到,则恢复健康状态,否则清除。
- 持久化实例会持久化到磁盘中(存到数据库),由server主动检测client服务状态,默认20秒检测一次,如果失败标记为不健康,但不会从内存删除。
宕机问题思考
假如已完成流程:服务A、B注册向Nacos注册服务 -> Nacos存储服务实例 -> B服务调用A服务
看前置知识第4点,结论是Nacos如果宕机了,不论是临时实例和持久化实例
Nacos宕机后,Client端已经缓存在本地服务实例依然可以使用,除非服务不可用或者真实的服实例发生变化。
个人思考,纯属理论结果,不对之处还请更正。
补充:
nacos中的配置也会缓存到本地,(为什么说这个,因为若在nacos有配置也不会受nacos服务关闭的影响,这样关掉nacos,就可以很方便验证理论了)
实践过程和结果:
单机部署nacos-server,部署两个接入nacos-client的服务A和B,并使用nacos配置中心,A使用Fegin调用B。在关闭nacos后,nacos无法登录,A和B、A调用B均未收到影响。