Nacos由阿里在2018年开源出来的动态服务发现与配置管理服务,核心功能为动态服务发现和配置管理,具有四个优势:
Nacos支持目前主流的Spring生态全栈,包括传统Spring、Springboot和Springcloud。
Nacos总体架构分为四个部分层:
由于Nacos框架整合了服务发现注册和配置中心两种功能,一般都会觉得既然一个框架实现了两种功能,这两种功能的实现肯定是大差不差的,或者有共同的代码实现逻辑的。但实际上Nacos的服务发现注册和配置中心的实现差异很大,因此从两种不同的功能原理上来分别阐述。
服务发现注册框架一般而言需要满足以下功能:
Nacos1.0 server之间、server和client之间的通信方式为HTTP,Nacos2.0后改为了长连接。
Nacos注册和拉取数据都是直接调用Server端HTTP接口,服务提供者在注册到Nacos Server端时可用ephemeral参数控制是否为临时节点,默认为临时节点。消费者拉取数据时可以选择是否订阅该数据,如果订阅了当订阅关系发生了改变时将会通知消费者,消费者的监听器会保存在本地内存。
Nacos发现注册功能通常会和Zookeeper和Eureka两者作比较,Zookeeper是CP,Eureka是AP,Nacos则同时支持CP和AP。
Nacos Server集群的一致性实现有两种方式:自研的AP一致性协议Distro,CP一致性协议Raft。Nacos集群支持同时运行两种协议,具体协议实现方式由客户端控制。当客户端的ephemeral参数为true,即临时节点,则会使用Distro;为false,即永久性节点,使用Raft协议。
Distro协议设计思想:
原理:
这里需要注意,Distro的每个节点都有全量数据,但为了保证每台机器的性能,每台机器只会处理部分写请求,如果写请求直接到负责的机器上,则直接处理,没有则进行路由转发。如果客户端配置了多个Server的地址,客户端会随机选择一个发送请求,如果只配了一个,则只会往该Server发送请求。
Raft协议和Zookeeper的ZAB协议类似,差异点如下表格:
功能项 | ZAB | Raft |
---|---|---|
选举方式 | 投票过半主从选举 | 投票过半主从选举 |
选举规则 | 1. 日志id zxid是最大的;2. 选举迭代epoch谁大谁优先;3. 自身机器配置id | 1. Leader的日志是最多的;2. 选举迭代term谁大谁优先;3. 内置超时等待时间,150-300ms随机,先超时则先发起投票,相当于随机初始优先级 |
角色差异 | 选举后有Leader、Follower和Observer;Leader和Follower由participant转换而来 | Leader和Follower统一由Candidate转换而来 |
日志同步 | 二阶段提交 | 二阶段提交 |
健康探测 | 由Leader发送ping,其它机器回应pong消息,需过半机器回应 | 由Leader发送心跳检测,需过半机器回应 |
Nacos的Server间和Server-Client间都存在健康检查机制来探测是否存活,Server间通过定期发送sync命令进行心跳检测和数据同步。Server-Client间的健康检查则分两种模式:
Nacos配置中心与市场中主流配置中心框架原理都大差不差,由控制台发布/更新/查询配置,Server集群负责更新配置库内容,并向Client提供监听功能,Client连接到Server,查询监听部分配置,当Server端发生改变时通知到对应的Client。
其区别在于每个步骤的具体实现方式,如:
每个配置中心的核心原理差异便是这五个,接下来我们就这五个问题深入Nacos的配置中心原理。
Nacos配置中心控制台支持的功能:
Nacos资源模型:
Nacos配置中心多集群的架构模式如下图:
用户在Nacos的控制台修改完数据后,将会由VIP系统分发到各个Server系统,Server系统接收到后将请求结果入库,随后异步向其它的Server发送数据修改通知,其它的Server接收到通知后将会读取数据库全量数据缓存到本地,以便后续更快的响应数据。
因此Nacos1.0配置中心的server使用HTTP通知的方式来完成Server间的一致性,Nacos2.0改为了使用长连接进行通知。
server的发现有两种方式:地址寻址和服务器寻址。
因此Nacos官方称这种模式保证了可用性,但非一致性,因此属于AP。
client和server的通信方式在1.0是长轮询,client端原理:client向server发送HTTP请求,超时时间为30s,在30s内如果收到了回复则说明有数据变更,接收返回信息并更新本地缓存数据,完成后再次发起长轮询;如果本次长轮询没有数据,则下次继续发起长轮询。
server端的处理原理:当接收到client的长轮询后,将会把其添加到订阅者数组中,当期间没发生数据变化时则在29.5s时回复给client空信息,以避免client网络超时抛异常;如果期间数据发生了改动,则会收到LocalDataChange事件,并匹配监听改动的订阅者,回复其改动信息,并将订阅者从列表中删除。
在Nacos2.0版本将长轮询改为了长连接。
client在启动后将会调用server端的HTTP接口直接拉取数据,拉取下来的数据会在本地生成配置的快照,当客户端无法连接到Server时,可以使用本地的配置提高整体容灾能力,本地缓存不会过期。
如果Nacos有多台Server且client配置了多个server地址,第一次调用时会随机获取一个server地址,如果后续网络和服务一直是正常的,则一直保持不变。但如果因为宕机或因网络问题连接不上时,则会获取下一个随机地址。