Nacos热更新原理
部分内容来源:王二Java
介绍一下Nacos配置中心原理
配置中心,说白了就是一句话:配置信息的 CRUD
配置中心
具体的实现大概可以分成这么几个部分:
- 配置信息存储:Nacos 默认使用内嵌数据库 Derby 来存储配置信息,还可以采用 MySQL 等关系型数据库。
- 注册配置信息:服务启动时,Nacos Client 会向 Nacos Server 注册自己的配置信息,这个注册过程就是把配置信息写入存储,并生成版本号。
- 获取配置信息:服务运行期间,Nacos Client 通过 API 从 Nacos Server 获取配置信息。Server 根据键查找对应的配置信息,并返回给 Client。
- 监听配置变化:Nacos Client 可以通过注册监听器的方式,实现对配置信息的监听。当配置信息发生变化时,Nacos Server 会通知已注册的监听器,并触发相应的回调方法
介绍一下Nacos配置中心的长轮询机制
一般来说客户端和服务端的交互分为两种:推(Push)和拉(Pull)
Nacos 在Pull的基础上,采用了长轮询来进行配置的动态刷新
长轮询通过 【待机等待 + 变更触发】 的机制
既保证了配置变更能被快速感知(秒级),又避免了 “配置未改却频繁通知” 的资源浪费
这是配置中心实现高效监听的关键设计
在长轮询模式下,客户端定时向服务端发起请求
检查配置信息是否发生变更。如果没有变更,服务端会\"hold\"住这个请求,即暂时不返回结果,直到配置发生变化或达到一定的超时时间
具体的实现过程如下:
Nacos长轮询
- 客户端发起 Pull 请求,服务端检查配置是否有变更。如果没有变更,则设置一个定时任务,在一段时间后执行,并将当前的客户端连接加入到等待队列中。
- 在等待期间,如果配置发生变更,服务端会立即返回结果给客户端,完成一次\"推送\"操作。
- 如果在等待期间没有配置变更,等待时间达到预设的超时时间后,服务端会自动返回结果给客户端,即使配置没有变更。服务端会在超时后返回一个 “空响应”(或标识 “无变更” 的响应),客户端收到后会立即重新发起请求,维持长连接
- 如果在等待期间,通过 Nacos Dashboard 或 API 对配置进行了修改,会触发一个事件机制,服务端会遍历等待队列,找到发生变更的配置项对应的客户端连接,并将变更的数据通过连接返回,完成一次\"推送\"操作
如果让你来实现 服务的注册中心,那么它需要哪些功能呢?
服务发现,服务注册,服务注销
持久化,热更新配置,监控统计
Nacos 配置中心的功能用过吗?动态刷新是如何实现的?
Nacos 配置中心的动态刷新主要基于长轮询和事件通知机制,具体步骤如下:
- 客户端注册监听:客户端在启动时会向 Nacos 服务器注册对指定配置的监听。客户端会记录配置的 MD5 值或版本号,用于后续判断配置是否发生变化。
- 长轮询机制:客户端定期向 Nacos 服务器发送请求,询问配置是否有更新。Nacos 服务器接收到请求后,如果配置没有变化,会将请求挂起一段时间(默认 30 秒),等待配置更新。如果在这段时间内配置发生了变化,服务器会立即响应客户端,并返回最新的配置信息。
- 事件通知:当管理员在 Nacos 控制台或通过 API 修改配置时,Nacos 服务器会触发配置变更事件。服务器会将配置变更信息通知给所有监听该配置的客户端。
- 客户端更新配置:客户端接收到配置变更通知后,会从 Nacos 服务器获取最新的配置信息,并更新本地配置。同时,客户端会更新本地记录的配置 MD5 值或版本号
说一下Nacos热部署原理
服务注册与心跳机制
服务注册:服务提供者在启动时会向 Nacos 服务器注册自己的服务信息,包括服务名称、IP 地址、端口号、元数据等。服务器将这些信息存储在内存中,并维护一个服务实例列表
心跳机制:服务提供者会定期向 Nacos 服务器发送心跳包,表明自己处于存活状态。服务器通过心跳包来判断服务实例的健康状态,如果在一定时间内没有收到某个服务实例的心跳包,会将该实例从服务列表中移除
客户端服务发现与缓存更新
服务发现:服务消费者在启动时会从 Nacos 服务器获取服务实例列表,并将其缓存到本地
当需要调用服务时,直接从本地缓存中获取服务实例信息
缓存更新:Nacos 服务器在服务实例发生变化(如服务注册、注销、状态变更等)时,会将变化信息推送给订阅了该服务的客户端。客户端接收到通知后,会更新本地的服务实例缓存,从而实现服务实例的热部署
Nacos原理-快速复习
两个角色:
- Nacos Server 服务端
- Nacos Client 客户端
Nacos注册流程:
- Nacos通过内嵌数据库Derby或者Mysql来存储配置信息
- 服务启动后,客户端像服务端注册,将配置信息写入客户端,并且生成版本号
- 服务运行期间,Nacos Client 通过 API 从 Nacos Server 获取配置信息
- 客户端通过注册监听器实现监听,当配置信息发生变化时,服务端会通知已注册的监听器,并触发相应的回调方法
Nacos基于pull拉取模式结合长轮询进行配置的动态更新:
动态刷新主要基于【长轮询+事件通知】机制
Nacos的长轮询是【待机等待 + 变更触发】 机制
- 每个服务的配置都有定时任务,如果在等待期间配置变更,会触发一个事件机制,服务端会遍历等待队列,找到发生变更的配置项对应的客户端连接,并将变更的数据通过连接推送给客户端
- 如果在等待期间配置没变更,服务端会在超时后返回一个 “空响应”(或标识 “无变更” 的响应),
客户端收到后会立即重新发起请求维持长连接(维持监听) - 客户端接收到配置变更通知后,会从 Nacos 服务器获取最新的配置信息,并更新本地配置。同时,客户端会更新本地记录的配置 MD5 值或版本号
哪些是配置中心必须的功能:
- 服务发现
- 服务注册
- 服务注销
- 持久化
- 热更新配置
- 监控统计
Nacos热部署原理(Server使用本地缓存实现热更新):
- 服务注册:服务提供者在启动时会向 Nacos 服务器注册自己的服务信息
- 心跳机制:服务提供者会定期向 Nacos 服务器发送心跳包,表明自己处于存活状态
- 服务发现:服务消费者在启动时会从 Nacos 服务器获取服务实例列表,并将其缓存到本地
当需要调用服务时,直接从本地缓存中获取服务实例信息 - 服务端本地缓存更新:Nacos 服务器在服务实例发生变化(如服务注册、注销、状态变更等)时,会将变化信息推送给订阅了该服务的客户端。客户端接收到通知后,会更新本地的服务实例缓存,从而实现服务实例的热部署