1. 从服务注册发现来看
nacos服务端探测的健康检查方式的客户端(持久化服务),使用强一致性共识算法(Jraft)cp客户端心跳上报的服务(非持久话服务),使用最终一致共识算法(Distro)ap
临时实例
永久实例
健康检查任务
注册中心会在启动时注册一个全局的同步任务,用于将其当前负责的所有节点信息同步到集群中的其他节点,其他非负责的节点也会创建该客户端的信息,在非负责的节点上,连接类型的客户端,会有一个续约时间的概念,在收到其他节点的同步信息时,更新续约时间为当前时间,如果在集群中的其他节点在一段时间内没有收到不是自己的负责的节点的同步信息,那么认为此节点已经不健康,从而达到对不是自己负责的节点健康状态检查。
永久实例会在被主动删除前一直存在于注册中心,那么我们健康检查并不会去删除实例,所以我们只需要在负责的节点永久实例健康状态变更的时候通知到其余的节点即可
2. 从配置管理来看
Distro 协议的主要设计思想如下: Nacos 每个节点是平等的都可以处理写请求,同时把新数据同步到其他节点。 每个节点只负责部分数据,定时发送自己负责数据的校验值到其他节点来保持数据⼀致性。 每个节点独立处理读请求,及时从本地发出响应。
server间数据一致(有db)
一致性的核心是 Server 与 DB 保持数据一致性,从而保证 Server 数据一致;Server 之间都是对等的。数据写任何一个 Server,优先持久化,持久化成功后异步通知其他节点到数据库中拉取最新配置值,并且通知写入成功
(无db的时候,使用Jraft协议保证数据的一致)
sdk-server一致性
SDK 与 Server 一致性协议的核心是通过 MD5 值是否一致,如果不一致就拉取最新值。
Nacos 1.X 采用 Http 1.1 短链接模拟长链接,每 30s 发一个心跳跟 Server 对比 SDK 配置 MD5 值是否跟 Server 保持一致,如果一致就 hold 住链接,如果有不一致配置,就把不一致的配置返回,然后 SDK 获取最新配置值。
Nacos 2.x 相比上面 30s 一次的长轮训,升级成长链接模式,配置变更,启动建立长链接,配置变更服务端推送变更配置列表,然后 SDK 拉取配置更新,因此通信效率大幅提升。