nacos注册中心源码
2021-08-18 10:05:01 0 举报
nacos注册中心
作者其他创作
大纲/内容
/nacos/v1/ns/instance
putService(service)
启动固定的延迟任务100毫秒
queue.put(task)
描述了关于实例的id、名称、ip、端口和元数据等等这些信息。
BeatTask#run方法
实现
每次发完心跳嵌套调用延时任务5s一次发心跳
serviceManager.removeInstance
raftStore.write(datum);
callServer
客户端
调用同步接口
InnerWorker异步线程
/raft/datum/commit
集群节点之间相互同步节点状态如果有节点宕机了,集群其它节点会感知并更新集群节点状态,这个会影响心跳任务机器选择的计算
更新注册表,使写时复制的思想把原内存注册表复制一份 在副本上操作完后 在替换到真正的内存注册表中
同步实例信息给钱其它远程节点
如果是临时实例数据
bind(event)
@Bean构建注册实例信息
通过registration构建Instance实例
NamingProxy.syncData
把最终需要同步的信息封装成一个任务放入一个ma中ConcurrentHashMap
将key对应的实例列表传过去进行通知
getRegistration()
NacosRegistration
serviceManager.registerInstance
调用server的实例心跳接口
getDistroMapper().responsible(service.getName())
不是leader节点将注册请求转发到集群leader节点发送http请求
服务端心跳接口
Server端接口InstanceController#beat
引入nacos包
RaftConsistencyServiceImpl持久化数据(CP架构)阿里自己实现的Raft协议
ServiceManagerspan style=\"font-size: inherit;\
服务注册HTTP接口
Service
/instance
beatReactor.addBeatInfo
@Bean实现Nacos的自动注册功能
将Instance实例的信息封装成Http的请求
利用CountDownLatch实现了一个简单的Raft协议写入数据的逻辑必须集群半数以上的节点写入成功才会给客户端返回成功
serviceRegistry
往阻塞队列中添加需要注册的服务实例
HttpClient.asyncHttpPostLarge
同步失败,重试
PushService.onApplicationEvent
ServiceManager
instance.setLastBeat
发布服务变更事件
ServiceRegistry服务注册接口
service.processClientBeat
1.将注册实例更新到内存注册表
finally 语句中嵌套调用达到定时执行的效果默认2s
NamingProxy
ServiceReporter.run
if (instance.isEphemeral())非持久化实例 设置心跳任务
addTask
HealthCheckReactor.scheduleNow(clientBeatProcessor)立即启动一个心跳任务
如果是临时实例,则不会在Nacos服务端持久化存储,需要通过上报心跳的方式进行保活。 如果一段时间内没有上报心跳,则会被Nacos服务端摘除。在被摘除后如果又开始上报心跳,则会重新将这个实例注册。 持久化实例则会持久化到Nacos服务端,此时即使注册实例的客户端进程不在,这个实例也不会从服务端删除,只会将健康状态设为不健康
InstanceControlle.register服务端
从双层map注册表中获取服务 如果没有则创建
if (!isLeader())判断是否是leader节点
ClientBeatCheckTask#run
distroProtocol.sync 循环获取集群中所有的节点 除了自己单机模式不会执行
集群节点状态同步任务默认2s
初始化
将创建的空service放入内存注册表中
init()初始服务实例
DistroExecuteTaskExecuteEngine
onApplicationEvent
将新注册的实例 放入service实例列表中
getPushService().serviceChanged(this)
@Bean提供Nacos的注册功能
service.init()
处理客户端心跳
NacosServiceRegistry
NacosTaskProcessor类processor.process(task)
executorService.schedule(new BeatTask(beatInfo)延迟5s执行 心跳任务
源码入口启动时读取spring-cloud-starter-alibaba-nacos-discovery的jar包下的spring.factories文件中EnableAutoConfiguration对应的自动配置类
ClientBeatProcessor#run()
GlobalExecutor.submitDistroNotifyTask(notifier)
创建内存注册表结构
回调
DelegateConsistencyServiceImpl
更新客户端实例心跳时间
DistroConsistencyServiceImpl#put
循环处理map中的同步数据最终会添加到一个队列
ServerStatusReporter.run
new DistroDelayTaskExecuteEngine
instance.setHealthy(false)15秒没有收到心跳,修改健康状态
2.同步信息到集群其它节点
实现ApplicationListenerSpring容器启动时调用
异步任务更新内存注册表
udpPush(ackEntry)
更新注册实例到内存和磁盘文件上
task.run()
继承
reqApi调用实例注册接口
@PostConstructinit()
deleteIp(instance)超过30s 则在注册中心删除这台机器
异步执行
substractIpAddresses
/nacos/v1/ns/instance/beat心跳接口
DistroDelayTaskProcessor
UDP方法将服务变动通知给客户端
processTasks()处理map中的需要同步数据
Notifier.run循环从阻塞队列中获取数据处理
DistroProtocol
Runnable task = queue.take()
@Component(\"serverListManager\")ServerListManager
@PostConstruct初始化时启动一个线程
Service.onChange更新注册实例到注册表中
如服务端注册表中没有当前实例则需要先注册(网络不通导致下线或服务端重启临时实例丢失)
TaskExecuteWorker
循环获取队列中的数组
register
DistroSyncChangeTask
ArrayBlockingQueue放入阻塞队列
tasks.take()
NacosAutoServiceRegistration
用服务名称哈希后对机器数取模 选择机器里的一台机器执行任务
this.start()
executorService.schedule(new BeatTask()
serverProxy.registerService
AbstractAutoServiceRegistration
@ComponentServiceManager
同步写实例数据到文件
@PostConstructinit
给当前注册的服务,初始服务端心跳任务
调用实例注销接口HttpMethod.DELETR
@ComponentDistroTaskEngineHolder
NacosDiscoveryAutoConfiguration自动配置
processingExecutor.scheduleWithFixedDelay(new ProcessRunnable()
HealthCheckReactor.scheduleCheck(clientBeatCheckTask)
worker.process(task)
handleFailedTask()重新把数据放入map中
raftProxy.proxyPostLarge
distroComponentHolder.findTransportAgent(type).syncData
ProcessRunnable.run
每5秒执行一次
serviceRegistry.register(getRegistration())
当前时间 减去实例的上一次心跳时间是否大于默认时间
/distro/datum集群同步接口
0 条评论
下一页