在线QQ客服:1922638
专业的SQL Server、MySQL数据库同步软件Eureka服务端支持集群部署,通过源码查看集群节点发现以及数据同步功能的实现
提供集群功能的包路径
com.netflix.eureka.cluster
集群节点发现以及动态更新节点功能
Eureka服务端封装了一个集群节点管理的类名称为PeerEurekaNodes 通过名称翻译出来为对等的Eureka节点集合,可以看出这个类是对eureka服务端集群节点抽象,下面通过源码查询eureka是怎么管理与发现节点信息
通过PeerEurekaNodes类属性可以看到提供了两个集合以及一个执行定时任务的线程池,其它配置属性忽略
peerEurekaNodes 表示集群节点集合
peerEurekaNodeUrls 表示集群节点对应的URL集合
taskExecutor 执行定时任务的线程池
同时 PeerEurekaNodes 类提供start 与shutdown方法,接下来主要看start方法的实现
start 方法主要完成以下几件事
初始化定时任务线程池
首次更新集群节点 updatePeerEurekaNodes方法
创建更新集群节点任务线程
通过定时任务线程池定时执行更新集群节点线程
通过start 可以看出 eureka是通过一个定时线程定时去更新集群的节点信息达到对集群节点的动态发现和感知,在上面我们可以看到更新操作主要由updatePeerEurekaNodes方法完成,下面查看此方法的实现
updatePeerEurekaNodes根据传入的新集群URL集合完成节点的更新
校验传入的URL集合是否需要更新
移除新url集合中没有的旧节点并关闭节点
创建旧节点集合中没有的新URL节点通过createPeerEurekaNode方法
重新赋值节点集合以及URL集合完成节点的更新
updatePeerEurekaNodes传入的新URL集合是通过resolvePeerUrls方法获取,这个方法实际上是解析配置文件中的eureka.serviceUrl前缀的配置获取,并动态监听配置的更新。 创建新的节点是通过createPeerEurekaNode创建,下面查看此方法源码
PeerEurekaNode 方法
创建远程通讯客户端replicationClient 用户与此节点间通讯,数据同步等工作
获取要创建的远程节点的host
创建一个表示远程节点实例 PeerEurekaNode
PeerEurekaNode 表示一个与当前节点对等的远程节点,当前节点与远程节点的数据同步工作都是在此实例中完成的。
集群节点数据同步
在上面节点发现中知道eureka是通过PeerEurekaNode表示远程对等接点,并将远程通讯客户端replicationClient传入到PeerEurekaNode中,接下来通过查看PeerEurekaNode源码来看eureka集群节点间都有那些数据需要同步以及通讯内容
PeerEurekaNode 完成以下事件
创建数据同步的任务处理器ReplicationTaskProcessor
创建批处理任务调度器
创建单任务处理调度器
说明: eureka将节点间的数据同步工作包装成一个个细微的任务ReplicationTask ,每一个数据操作代表一个任务,将任务发送给任务调度器TaskDispatcher去异步处理。
下来查看PeerEurekaNode都可以创建那些同步任务
register
注册同步任务,当有服务注册到当前节点时,通过注册同步任务将服务信息同步到集群远程节点
cancel
取消服务注册任务,当前节点有服务取消注册,将信息同步到集群远程节点
heartbeat
心跳同步任务,当前节点有服务发送心跳续租,将信息同步到集群远程节点
StatusUpdate
DeleteStatusOverride
集群节点数据同步任务处理
在PeerEurekaNode的构造函数中可以看到同步任务处理由ReplicationTaskProcessor完成,下面看此类源码
单任务处理
调用任务task的execute完成远程数据同步
分析远程返回结果
批处理任务,将一组任务一次性发送到远程进行处理
根据task集合创建ReplicationList
调用批量同步接口将同步集合发送到远端节点同步数据 即调用rest API/{version}/peerreplication
分析远程返回结果
eureka 服务端 集群节点发现,数据同步功能主要是由PeerEurekaNodes与PeerEurekaNode类实现,通过源码的跟踪可以清晰看出集群实现的逻辑,方便在实际应用中对问题的定位