本文收录于专栏 Nacos 中 。
前边几篇文章我们一起看了Nacos中客户端注册时的服务端相关源码,在各个流程上做了简单梳理。这里我们做一个整体上的总结。
InstanceRequestHandler接收所有实例注册、注销相关的请求InstanceRequestHandler处理注册请求时,会调用EphemeralClientOperationServiceImpl中的registerInstance方法
Service添加到ServiceManager中。ServiceManager中会根据namespace缓存当前客户端Service类NotifyCenter发布ClientOperationEvent.ClientRegisterServiceEvent事件ClientServiceIndexesManager中的onEvent处理客户端操作事件ClientOperationEvent.ClientRegisterServiceEvent时:
ServiceEvent.ServiceChangedEventNamingSubscriberServiceV2Impl中的onEvent处理ServiceEvent.ServiceChangedEvent事件:
Service被封装成PushDelayTask添加到延迟任务处理引擎PushDelayTaskExecuteEngine中PushDelayTaskExecuteEngine中含有一个单线程延迟线程池,间隔指定时间去处理缓存的任务ConcurrentHashMapPushDelayTaskProcessor处理任务
Service组装成PushExecuteTask,然后使用NamingExecuteTaskDispatcher做任务分发,其实就是将任务添加到另一个任务处理引擎NacosExecuteTaskExecuteEngine中NacosExecuteTaskExecuteEngine的添加任务方法addTask时,会将当前任务交由TaskExecuteWorker处理TaskExecuteWorker继承了Thread,其内部维护了一个BlockingQueue queue ,重写的runtask.run();
Runnable,所以从队列中获取任务之后可以直接调用任务的runPushExecuteTask,一个也继承了Thread,在重写的run方法中会处理Service推送到订阅者的逻辑。以上,我们简单梳理了客户端注册到Nacos的大致流程,并且给出了其中一些关键的处理类。在前几篇源码分析的文章中,我们可以看出,客户端注册的流程设计里使用了大量的模版模式去封装局部逻辑。这使得在简单归纳源码之后,整个注册逻辑在流程上较为清晰可见。同时,Nacos面向事件而封装的NotifyCenter也让人印象深刻。
保持怀疑的眼光去审视时,也要有一颗学徒的心不断汲取优秀的设计思想和实现。
关于Nacos2.X版本使用grpc的相关逻辑,这里不再赘述,网上关于grpc的文章多如牛毛。
enjoy~