Nacos 2.1 注册中心原理

一、Nacos的核心要点

服务注册:Nacos Client通过发送请求的方式,向Nacos Server注册自己的服务,同时客户端提供元数据、IP地址、端口等信息。Nacos Server接收到client的请求之后,会把该实例注册到内存中的注册表(Map)中。
服务心跳:(2.1使用了grpc长链接方式,因此变成服务端检查客户端心跳)nacos 1.4中在服务注册成功后,Nacos client会维护一个定时心跳来持续通知Nacos Server,说明当前Nacos Client一直处于运行中,防止被Nacos Server剔除。Nacos Client默认5s发送一次心跳信息。
服务端健康检查:Nacos Server开启一个定时任务,每隔3s执行一次。Nacos Client超过20s没有发送心跳给Nacos Server,Nacos Server将发送请求探活,探活失败后将该Client剔除。
服务的发现:Nacos 2.1中新增了服务的订阅功能,Nacos Client在获取服务端注册表的数据时,会默认订阅该服务,Nacos Client会定时查询注册表数据并更新到本地副本中,默认6s一次。如果订阅的服务有变动,Nacos Server也会主动推送给所有订阅该服务的Client。
服务的同步:Nacos Server集群之间会互相同步服务实例,用于保证服务信息的一致性。

二、Nacos Client向服务端注册实例

2.1 Nacos Client发送注册请求

首先找到Nacos Client的自动配置类:
image.png

在自动配置类NacosServiceRegistryAutoConfiguration里面找到NacosAutoServiceRegistration#register()。
image.png

2.2 Nacos Server处理客户端的注册请求

InstanceRequestHandler#registerInstance将处理客户端注册实例的请求:
image.png

然后EphemeralClientOperationServiceImpl#register方法会把实例信息添加到注册表中,接着会发布ClientEvent.ClientChangedEvent、ClientOperationEvent.ClientRegisterServiceEvent、MetadataEvent.InstanceMetadataEvent这三个事件。

2.3 当服务端注册表发生改变时,会主动推送数据

NacosDelayTaskExecuteEngine在这个类中,会去处理变动的服务,并推送给所有订阅了该服务的客户端。

最终会在PushExecuteTask#run()方法中向所有订阅的客户端发起推送:
image.png

三、客户端获取服务端最新的注册表

3.1 客户端发起请求

入口在NacosNamingService.selectInstances()
image.png

3.2 服务端响应请求

入口在SubscribeServiceRequestHandler.handle()
image.png

四、服务端检查客户端是否存活

入口在ConnectionManager.start()
1.在这个方法中,主要是区分哪些client已经过期,并把过期的client存放到outDatedConnection集合中。
2.服务端会对过期的client进行一次探活操作,没有1s无响应,直接剔除该客户端。
3.发送该事件ClientDisconnectEvent,然后执行异步更新注册表、集群数据同步。

五、Nacos集群节点同步数据

入口在DistroClientDataProcessor.onEvent()
image

分支逻辑:
image
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容