背景
之前2篇学习过nacos客户端注册相关组件的注册,这里要继续学习下nacos服务端注册原理。
组件分析
如上所示分别为Service、Cluster、Instance三个服务模型结构,可有如下关系。
接下来看看ServiceManager。
ServiceManager执行注册时,首先创建服务放到Map中,然后初始化service,service初始化做延时客户端心跳检查任务,其次添加Instance,将添加实例委托给ConsistencyService.
接下来看看ConsistencyService添加实例的过程,nacos默认AP模式,按Distro协议实现实例添加。
1、DistroConsistencyServiceImpl初始化时会执行定时任务Notifier,Notifier循环执行从其阻塞队列中拿Pair,触发Record Listener去注册Instances(即格局key去DataStore中获取Instances注册);2、DistroConsistencyServiceImpl由ServiceManager触发添加Instance时会向DataSore中添加Instances并向Notifier中的阻塞队列中添加通知(服务注册)任务。这里还涉及集群同步(taskDispatcher.addTask(key))。接下来就是RecordListener的触发过程。
回头看看Service,发现Service即是RecoredListener,其最终执行实例注册,即分3步走,1、将ClusterMap复制到新的ClusterMap中,2、遍历Instances将instances添加到新的clusterMap中,3、合并新的clusterMap到Service的clusterMap中。当然这里还涉及cluster的初始化,即健康检查过程(HealthCheckTask)。到这里基本上注册就完成了。
总结
可以看到服务注册是个相对复杂的过程,但是看到ServiceManager的Map<String, Map<String, Service>> serviceMap = new ConcurrentHashMap<>()和服务的模型结构,即Service、Cluster、Instance也能大概猜到服务的存储,无非就是Service的构建,然后放到Map中,那剩下具体的就是要提高写入性能和高可用,即批次异步添加和copyOnWrite。接下来会继续学习下gateway。