一、Nacos 1.X架构层次

Nacos 1.X 大致分为5层, 分别是接入层、通信层、功能层、同步层和持久化层。
1、接入层是
用户最直接交互的层面,主要有Nacos客户端,以及依赖客户端的Dubbo和SCA以及用户操作的控制台Console组成。 客户端和Console进行服务和配置操作,统一通过HTTP的OpenAPI发起通信请求。
2、通信层
主要基于HTTP的短连接请求模型进行,部分推送功能通过UDP进行通信。
3、功能层
目前有服务发现和配置管理,这层也就是实际管理服务和配置的业务层。
4、同步层
有数据同步的AP模式Distro和CP模式Raft,还有有一个最简易的水平通知Notify,用处各不相同:
- Distro:非持久化服务的同步模式
- Raft:持久化服务的同步模式、以及使用Derby作为配置的存储时同步配置操作。
- Notify:使用MySQL作为配置的存储时,通知其他节点更新缓存及发起配置推送。
5、持久化层
Nacos使用MySQL、Derby和本地文件系统来进行数据的持久化 配置信息,用户信息,权限信息存储在MySQL或Derby数据库中, 持久化服务信息及服务和实例元数据信息存储在本地文件系统。
二、Nacos 1.X架构下的服务发现模型
我们通过一个服务发现的流程,再深入熟悉一下Nacos 1.X架构和基于当前架构的Nacos服务发现模型。
服务注册流程
1、Nacos客户端注册服务会通过OpenAPI发送Http注册服务的请求,请求内容会带上服务信息及实例信息,通常这个步骤是由微服务框架SCA和dubbo完成。
2、服务端收到请求后,会先在Contoller中进行数据的读取和校验,比如IP是否合法,服务名是否正确等等。校验通过后,如果这个服务是第一次注册,Nacos会在服务端生成一个Service对象,然后把这次注册的实例信息存入这个Service对象中;如果Nacos服务端已经有了这个Service对象,那么就会直接把新注册的实例信息存入对象。这个Service对象通过 命名空间+Group+Service 的组合来保证唯一性。
3、完成实例存入Service的同时,会触发两个事件,其中一个事件是用于数据同步的,Nacos服务端会根据这个服务是否是临时对象的信息,使用Distro或者Raft协议进行同步,通知其他的Nacos节点该服务发生了变更;另一个事件则通知在该Nacos服务节点上订阅了该服务的订阅者,并根据订阅者信息,通过UDP的方式,把最新的服务列表推送到订阅者客户端上。这就完成了一次服务注册流程。
另外,对于那些被定义为持久化的服务的所有信息,都会通过raft协议,保证能够写入到文件系统中被持久化。
最后,其他的Nacos节点,在通过同步而进行Service变更的时候也会触发通知订阅者的事件,从而使在其他Nacos服务节点上订阅该服务的订阅者也能收到推送。
