【Java面试】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使用的是异步的方式来更新数据,并且会发布一个事件来让集群中的其他节点知道数据更新了。

猜你喜欢

转载自blog.csdn.net/Zhangsama1/article/details/132145216