【Nacos源码系列】客户端(AP模式)

  Nacos作为注册中心越来越流行,而且性能强大,所以有必要看看源码,了解下它的运行机制了,下面是对Nacos客户端的分析

  一、简介

  1、官网文档(https://nacos.io/zh-cn/docs/what-is-nacos.html)

  2、使用和版本

  2.1、引入依赖

  父Pom中支持springboot、spring cloud、spring cloud alibaba

  2.2、当前项目pom中引入nacos依赖

  2.3、application.properties中配置

  二、核心功能

  1、注册流程

  将ip和port等信息注册到服务端,将服务暴露出来供其它服务使用

  2、心跳机制

  AP模式下,发起http请求给服务端,维护服务的状态,默认5秒执行一次(CP模式是服务端主动检查);

  3、服务发现

  3.1 通过http获取需要的服务实例的列表,并且定时拉取最新数据,默认1秒执行一次;

  3.2 通过udp协议,服务端推送变动消息来更新服务实例列表;

  三、整体的源码交互流程图

  

  四、注册流程源码分析

  1、注册入口

  通过spring-cloud-starter-alibaba-nacos-discovery-2.2.1.RELEASE.jar下面的SPI扩展机制spring.factories中的

  NacosServiceRegistryAutoConfiguration自动注册

  2、NacosAutoServiceRegistration结构

  3、通过监听SpringBoot的WebServerInitializedEvent事件来进行注册动作,核心流程如下3.1 调用AbstractAutoServiceRegistration#onApplicationEvent

  start方法

  3.2 com.alibaba.cloud.nacos.registry.NacosServiceRegistry#register

  3.3 com.alibaba.nacos.client.naming.NacosNamingService#registerInstance

  3.4 执行注册动作com.alibaba.nacos.client.naming.net.NamingProxy#registerService

  五、心跳机制源码分析

  1、在注册之间将心跳定时任务构建com.alibaba.nacos.client.naming.NacosNamingService#registerInstance

  2、com.alibaba.nacos.client.naming.beat.BeatReactor#addBeatInfo

  3、com.alibaba.nacos.client.naming.beat.BeatReactor.BeatTask#run

  4、com.alibaba.nacos.client.naming.net.NamingProxy#sendBeat

  六、服务发现源码分析

  一般都是服务第一次被调用的时候才会去获取

  1、com.alibaba.nacos.client.naming.NacosNamingService#getAllInstances

  2、com.alibaba.nacos.client.naming.core.HostReactor#getServiceInfo

  3、com.alibaba.nacos.client.naming.core.HostReactor#updateServiceNow

  4、com.alibaba.nacos.client.naming.net.NamingProxy#queryList

  特别注意这个udpPort,用于udp通信,后续nacos服务端会通过udp协议push消息,接收服务实例变化的通知

  5、第3步中,需要开启定死任务去拉取更新列表

  com.alibaba.nacos.client.naming.core.HostReactor#scheduleUpdateIfAbsent

  添加任务

  6、更新任务执行com.alibaba.nacos.client.naming.core.HostReactor.UpdateTask#run

  7、服务端push消息,来更新服务实例列表

  创建com.alibaba.nacos.client.naming.core.PushReceiver不断的接收upd数据

  解析数据、更新实例数据、发送ack消息

  com.alibaba.nacos.client.naming.core.PushReceiver#run

  七、总结

  1、nacos客户端通过springboot的自动配置机制实现注册,并且通过springboot发送的事件消息来触发注册动作;

  2、AP模式下为了维护注册服务的状态,通过心跳机制不断给服务端发送心跳,来保持活跃状态(CP模式是nacos服务器主动发请求检查tcp、http);

  3、获取的服务通过两个方式来维护最新的数据,一个是通过主动定时的拉取,另一个是通过udp协议被动的接收服务端push的消息;

  第零个星期:【Nacos源码系列】AP集群-注册流程