9、Nacos服务注册服务端源码分析(总结篇)

本文收录于专栏 Nacos 中 。

文章目录


前言

前边几篇文章我们一起看了Nacos中客户端注册时的服务端相关源码,在各个流程上做了简单梳理。这里我们做一个整体上的总结。

流程

一、接收客户端请求,发布客户端注册事件

  • InstanceRequestHandler接收所有实例注册、注销相关的请求
  • InstanceRequestHandler处理注册请求时,会调用EphemeralClientOperationServiceImpl中的registerInstance方法
    • 将当前封装客户端信息的Service添加到ServiceManager中。ServiceManager中会根据namespace缓存当前客户端Service
    • NotifyCenter发布ClientOperationEvent.ClientRegisterServiceEvent事件

二、处理客户端注册事件

  • ClientServiceIndexesManager中的onEvent处理客户端操作事件
  • 当前事件为客户端注册事件ClientOperationEvent.ClientRegisterServiceEvent时:
    • 发布新事件ServiceEvent.ServiceChangedEvent
  • NamingSubscriberServiceV2Impl中的onEvent处理ServiceEvent.ServiceChangedEvent事件:
    • 当前客户端Service被封装成PushDelayTask添加到延迟任务处理引擎 PushDelayTaskExecuteEngine

三、任务处理引擎

  • 任务处理引擎PushDelayTaskExecuteEngine中含有一个单线程延迟线程池,间隔指定时间去处理缓存的任务ConcurrentHashMap<Object, AbstractDelayTask> tasks
  • 延时线程池处理任务时,会使用任务处理器PushDelayTaskProcessor处理任务
    • 将客户端Service组装成PushExecuteTask,然后使用NamingExecuteTaskDispatcher做任务分发,其实就是将任务添加到另一个任务处理引擎NacosExecuteTaskExecuteEngine
    • 调用NacosExecuteTaskExecuteEngine的添加任务方法addTask时,会将当前任务交由TaskExecuteWorker处理

四、执行任务(PushDelayTask)

  • TaskExecuteWorker继承了Thread,其内部维护了一个BlockingQueue<Runnable> queue,重写的run
    方法会不断去扫描队列,然后执行队列中的任务task.run();
    • 这里我们要注意队列中的数据类型是Runnable,所以从队列中获取任务之后可以直接调用任务的run
      方法
    • 结合前边的流程,那么这里的任务其实是PushExecuteTask,一个也继承了Thread,在重写的run方法中会处理Service推送到订阅者的逻辑。

总结

以上,我们简单梳理了客户端注册到Nacos的大致流程,并且给出了其中一些关键的处理类。在前几篇源码分析的文章中,我们可以看出,客户端注册的流程设计里使用了大量的模版模式 去封装局部逻辑。这使得在简单归纳源码之后,整个注册逻辑在流程上较为清晰可见。同时,Nacos面向事件而封装的NotifyCenter也让人印象深刻。

保持怀疑的眼光去审视时,也要有一颗学徒的心不断汲取优秀的设计思想和实现。

关于Nacos2.X版本使用grpc的相关逻辑,这里不再赘述,网上关于grpc的文章多如牛毛。

enjoy~

相关推荐
weixin_BYSJ198724 分钟前
「课设设计」springboot校园超市助购系统26449 (附源码)
java·javascript·spring boot·python·django·flask·php
栋***t29 分钟前
从“纸质试卷”到“AI智能组卷”,麦塔在线考试系统如何重构出题逻辑?
java·大数据·人工智能·算法·重构
CHANG_THE_WORLD37 分钟前
深入理解递归:从函数调用到调用栈的完整执行过程
java·开发语言·算法
xexpertS39 分钟前
CI/CD 熔断机制:如何通过编排级熔断器提升开发者效率
java·linux·运维
zy happy1 小时前
VMware虚拟机添加新的硬盘
java·linux·jvm·docker
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第192题】【08_Kafka篇】第8题:死信队列是什么?延时队列是什么?
java·kafka·消息队列·死信队列·延时队列
meng半颗糖2 小时前
3.Java流程控制语句
java·开发语言·intellij-idea
大模型码小白2 小时前
企业级检索增强后端集成:Java 服务如何管理知识库版本
java·服务器·开发语言·人工智能·python·microsoft
用户6169182299932 小时前
记录一次死锁检测
java
jvmind_dev2 小时前
1c1g 容器莫名 OOM Killed?排查 Metaspace 持续增长与脚本引擎的坑
java·后端