大家好,分类投票评选网站源码分享相信很多的网友都不是很明白,包括评选投票系统源码也是一样,不过没有关系,接下来就来为大家分享关于分类投票评选网站源码分享和评选投票系统源码的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
大家好,我是杰哥
上周,我们通过文章SpringCloud(五):注册中心-nacos篇,对nacos作为注册中心,有了一个基本的了解。那么按照惯例,今天就要进行真正有料的环节-源码探究
本篇,将站在服务端的视角,对于nacos作为服务注册中心的选举、心跳、注册以及服务同步几个重要动作的流程解析,一步步深入了解nacos注册中心的真正原理
为了方便跟踪源码,我们先来一起搭建一个nacos的集群环境
一环境
集群搭建
01.nacos集群环境架构图
nacos的集群环境架构,建议:域名+VIP模式,这种可读性好,而且换ip方便,是官网的推荐模式
02.集群部署步骤
整体部署过程与单点部署过程基本一致,只是集群模式是多节点的模式而已
可以参照上一篇文章中的单点部署过程
1)安装包地址
https://github.com/alibaba/nacos/releases
2)解压
解压压缩包为nacos,并复制为nacos-1,nacos-2
3)配置application.properties文件
分别进入nacos/conf,nacos-1/conf,nacos-2/conf目录,进行application.properties文件的配置
a服务端口配置
三个服务端口分别配置为:
server.port=8848
server.port=8847
server.port=8846
b数据库配置
此步骤为可选步骤。nacos默认使用的是内嵌数据库,我们可以通过配置数据库信息,将数据信息存储在我们的mysql数据库中,可以通过在三个服务的配置文件中均添加以下mysql配置来实现
itisip
run()方法
a与选举定时任务的处理类似,进入心跳检测前,会先按照500ms的梯度进行递减,减少到不大于0后,触发心跳
b执行方法sendBeat(),发送心跳包
2)进入sendBeat()方法
由于方法比较长,我们分为两部分进行解读
第一部分基本判断
a首先,判断该节点是否是leader,若不是,则不需要发送心跳
b若是leader,则重置leader的任期时间leaderDueMs,顺便说一句,这个时间间隔,就是如果收不到leader的心跳,该节点就会进行重新选举的时间间隔
第二部分心跳包数据组装
分为两种情况进行发送数据的处理
a只需要发送心跳包,不用做任何处理
b除了发送心跳包,还要发送数据,则需要将数据都添加到packet中(这些数据包含注册的实例的更新情况)
c最后,将所有数据最终都放入params中,转换成json,并使用gzip压缩
第三部分心跳发送
a构造url
b分别向所有follower节点发送心跳包
3)接收到心跳包
调用/beat接口,进行心跳的发送,同时返回接收结果
4)进入RaftCorewrite()方法,将Datum序列化为json写到本地缓存中
b将Datum存放到RaftCore的datums集合中
c调用
notifier.addTask(datum,Notifier.ApplyAction.CHANGE)
通知对应的RaftListener,删除key对应的旧的Datum
d重置leaderDue时间
e更新本地节点的任期term
小结1
选举和心跳部分的源码处理流程,用一个图表示,你就更清晰啦
03.实例注册过程
当新服务启动,需要注册在nacos-server上,那么此时就需要进行进行服务的注册,进入ServiceManagerregisterInstance()方法
a创建空service
b调用addInstance()方法添加新的实例
2)进入addInstance()方法
该方法主要添加instance到缓存中,并且持久化
3)进入addIpAddresss()方法
该方法通过调用updateIpAddresss()方法进行具体处理
4)进入updateIpAddresss()方法
我们看到该方法实际上是通过调用setValid()方法,将旧实例列表与新实例列表进行合并的
5)实例信息持久化consistencyService.put(key,instances)
再来回到实例信息持久化的方法,该方法通过调用RaftCore#signalPublish()方法,进行具体的实例信息持久化
6)实现实例信息持久化,分为两个部分
第一部分基本判断
a若节点不为leader状态,则转发请求给leader
b若节点为leader状态,则将包发送给所有follower
第二部分发送消息,同步给大多数节点
发送消息,同步等待,接受到大多数节点的响应之后,返回成功
小结2
实例注册过程的源码处理流程如下图
04.实例同步过程
Nacos通过Raft发布内容,内容只是存在了Leader节点上,而要实现服务信息的同步,则采用Raft心跳机制实现
在说心跳过程的时候,我们提到了,leader发送心跳请求时,会分为两种情况,有数据和无数据,其中有数据情况下的数据就是我们的需要同步的服务数据
我们来理一下,在注册服务的时候,addInstance()方法将instance添加到了本地缓存中
然后,raft实现数据从leader到follower的数据同步。follower接收到包之后,通过onPublish()方法进行了持久化,但没有将信息更新到本地缓存,更新到本地缓存,这一动作,实际上是通过一个监听器来实现:
notifier.addTask(datum.key,ApplyAction.CHANGE)
即:将本次的变动,添加到通知任务中,然后进行后续处理
我们来继续看看,通知任务将如何被处理
1)添加服务变更到tasks队列
2)删除任务列表中的Key,根据变更类型,调用对应的方法进行缓存更新
于是,服务便得到了真正的同步
小结3
实例同步过程,源码流程如下图
四总结
总而言之
好了,今天的推送到这里就结束啦,肝源码,真的是一件枯燥的,艰难的,费时的事情。本篇文章,不夸张的说,杰哥我花了一周多的下班时间准备,本来想着最多两天搞定的。。。
不过还好,完成之后,感觉收获也很大,相信这篇文章,也会带给你们更大的收获
进行分条总结一番~
1搭建nacos集群环境
2源码探究-选举
3源码探究-心跳
4源码探究-注册
5源码探究-服务同步
本篇文章,通过搭建集群环境,让大家对于nacos的集群环境有了初步的印象。然后通过跟踪源码,针对nacos服务端的选举、心跳、服务注册以及服务同步,分别进行梳理以及步骤说明,并且每个环节结束,都以一张总体源码流程图进行总结。
相信大家对于nacos作为注册中心的基本机制有了一定的了解了!
嗯,就这样。每天学习一点,时间会见证你的强大~
下期预告:
SpringCloud(六):注册中心nacos-站在客户端角度
好了,关于分类投票评选网站源码分享和评选投票系统源码的问题到这里结束啦,希望可以解决您的问题哈!