文章目录
- Nacos自动注册原理实现
- 服务注册更新并如何保存到注册表
Nacos自动注册原理实现
完整流程
 我们知道SpringBoot提供了挂载点的方式来帮助我们的类完成自动注入。
 Nacos再META-INF的spring.factories这个文件中添加了自己需要自动注入的Bean对象。
 叫做NacosServiceRegistry,这个类实现了SpringCloud提供的register方法,来帮助我们向注册中心注册实例。
 因此后面的操作流程就变为了,如何让服务启动的时候,就能自动的调用这个register方法。
 Nacos的方法是依靠Spring的容器创建发生的事件来做到的。
 我们知道创建IOC容器的时候会调用refresh方法来注册监听器,发布事件。
 而Nacos的自动注册类就实现了ApplicationListener方法并且它监听的就是ServletWeb的初始化事件。
 那么只要在容器完成初始化之后,就会完成将当前服务注册到注册中心这一过程。
服务注册更新并如何保存到注册表
完整流程
 我们知道Nacos有三个隔离环境的东西,namespace,group,service。
 其中service就是具体的服务,而这些服务支持以集群的方式部署,所以service中包含了cluster这个结构。
 从上面的分析我们也知道,Nacos的注册表信息,应该是一个类似于三层Map的一个结构。
 也就是namespace里面对应多个group,每个group可以有多个的service,service中可以有集群cluster,而这些cluster集群中的一个又一个的,就是我们的instance实例,也就是我们启动的一个又一个的微服务。
 所以当我们注册一个服务的时候,我们需要先获取到Service,知道它是那个服务,然后将当前实例放入到这个服务对应的集合中去。
 此时我们就可以使用上面的服务的namespace,group的方式来定位到这个service。
 定位到service之后,如果service还没创建就创建,Nacos为了保证并发安全甚至使用了双检索的方式来创建service,然后创建完毕service之后就可以将服务放入,结构为服务名称:服务实例。
 而此时,这将会创建一个定时任务,这个定时任务将会获取到当前service中的所有实例,并且判断15s内是否发送回了心跳,如果没有的话,会将实例的healthy状态设定为false,而如果超过30s,那么当前实例将会被剔除。
 到此时service就已经创建好了,我们现在要做的就是吧当前的新实例添加进去。
 Nacos的方式为全量添加,也就是先获取之前已经存在的,然后再补上当前的。
 这里用到一个CopyOnWrite的方式来保证并发安全。
 之后的流程就是判断当前实例是临时还是持久实例,然后放入到临时或者持久实例对应的set集合中去。
 这里分为Distro和Raft两种协议,Distro使用的是异步的方式来更新数据,并且会发布一个事件来让集群中的其他节点知道数据更新了。