一、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的自动配置类:![](https://img.haomeiwen.com/i3245844/d6138397bbe42153.png)
![](https://img.haomeiwen.com/i3245844/72866120aea0f281.png)
2.2 Nacos Server处理客户端的注册请求
InstanceRequestHandler#registerInstance将处理客户端注册实例的请求:![](https://img.haomeiwen.com/i3245844/a87f34132e0119ae.png)
然后EphemeralClientOperationServiceImpl#register方法会把实例信息添加到注册表中,接着会发布ClientEvent.ClientChangedEvent、ClientOperationEvent.ClientRegisterServiceEvent、MetadataEvent.InstanceMetadataEvent这三个事件。
2.3 当服务端注册表发生改变时,会主动推送数据
NacosDelayTaskExecuteEngine在这个类中,会去处理变动的服务,并推送给所有订阅了该服务的客户端。
![](https://img.haomeiwen.com/i3245844/10d78c77211cb345.png)
三、客户端获取服务端最新的注册表
3.1 客户端发起请求
入口在NacosNamingService.selectInstances()![](https://img.haomeiwen.com/i3245844/7aee9c66265ab8fb.png)
3.2 服务端响应请求
入口在SubscribeServiceRequestHandler.handle()![](https://img.haomeiwen.com/i3245844/4df6c43254f3545f.png)
四、服务端检查客户端是否存活
入口在ConnectionManager.start()
1.在这个方法中,主要是区分哪些client已经过期,并把过期的client存放到outDatedConnection集合中。
2.服务端会对过期的client进行一次探活操作,没有1s无响应,直接剔除该客户端。
3.发送该事件ClientDisconnectEvent,然后执行异步更新注册表、集群数据同步。
五、Nacos集群节点同步数据
入口在DistroClientDataProcessor.onEvent()![](https://img.haomeiwen.com/i3245844/d03ece78498ad86d.png)
![](https://img.haomeiwen.com/i3245844/76c4a8877227f705.png)
网友评论