全网最细的nacos服务端服务注册:没有之一

2024-02-05 00:28

本文主要是介绍全网最细的nacos服务端服务注册:没有之一,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

服务端注册入口

BaseRpcServer
image.png
由于有@PostConstrct注解,也就是说在构造方法后会执行,startServer会由它的子类BaseGrpcServer.startServer重写

BaseGrpcServer.startServer

image.png
addServices:
image.png
其中grpcCommonRequestAcceptor和grpcBiStreamRequestAcceptor就是实现了nacos_grpc_service.proto的两个子处理类
public class GrpcRequestAcceptor extends RequestGrpc.RequestImplBase {
�public class GrpcBiStreamRequestAcceptor extends BiRequestStreamGrpc.BiRequestStreamImplBase {

对应nacos_grpc_service.proto中的两个方法处理

service Request {// Sends a commonRequestrpc request (Payload) returns (Payload) {}
}service BiRequestStream {// Sends a biStreamRequestrpc requestBiStream (stream Payload) returns (stream Payload) {}
}

GrpcRequestAcceptor.request

image.png
image.png
这里最终会调用到InstanceRequestHandler.handle方法,不用猜基本上就知道要做什么,实例相关的操作

InstanceRequestHandler.handle

image.png
image.png
最终会调用到EphemeralClientOperationServiceImpl.registerInstance

EphemeralClientOperationServiceImpl.registerInstance

image.png
具体做了几件事:

  1. 从ServiceManger里面通过service来获取service(包含namespace,group,name,ephemeral=true),我们来看一下ServiceManger具体是什么样子的存储结构?

image.png
更加形象的是这样:
image.png

  1. 从ClientManger通过clientId获取Client,这里我们来看一下clientId、ClientManger、Client分别是什么?

ClientId:
image.png
ClientManger: 专门用来管理客户端连接的组件
image.png
Client:客户端信息
上图中connectionBasedClientManger里面的clients属性 ,里面存储的key、value,key为clientId,value为客户端信息,也就是上面的ConnectionBasedClient
image.png

  1. 创建发布信息,并将发布信息放到ConnectionBasedClient中

image.png
将Service和publishInfo放到publishers中,实际的数据如图:
image.png

  1. 发布ClientRegisterServiceEvent�事件,具体需要看看这个事件是由谁来处理,其实很好找,看看这个那个类使用了这个事件就行,最终找到了ClientServcieIndexesManger

ClientServiceIndexesManager.handleClientOperation

image.png
image.png
image.png
这里总结一下做了几件事:

  1. 将service以及clientId放到publisherIndexes中,存储的格式就是<Service,Set>,更加形象的图如图:

image.png

  1. 发布ServiceChangedEvent事件,这个事件最终会被NamingSubscriberServiceV2Impl给处理

NamingSubscriberServiceV2Impl.onEvent

image.png
这里会将事件封装成PushDelayTask,然后使用delayTaskEngine,这里的delayTaskEngine是PushDelayTaskExecute

PushDelayTaskExecuteEngine�.addTask

PushDealyTaskExecuteEngine继承了NacosDelayTaskExecuteEngine,最终会调用到父类的addTask方法
image.png
image.png
image.png
其实这里比较简单,就是把task加入到ConcurrentHashMap里面去,key就是Servcie,value就是pushDelayTask

加入到这个ConcurrentHashMap肯定是要被处理的,那我们看看是在哪里被处理?

  1. NacosDelayTaskExecuteEngine在构造方法里面创建了一个定时调度的线程池,里面有一个被定时调度的任务,每隔100ms被调度执行

image.png
image.png

  1. NacosDelayTaskExecuteEngine.processTask

image.png
遍历上面的concurrentHashMap,然后通过taskkey然后找到处理类,因为我们没有设置,所以这里的NacosTaskProcessor就是子类PushDelayTaskExecuteEnginge里面设置的PushDelayTaskProcessor
image.png

  1. PushDelayTaskProcessor.process

image.png
image.png
这里的NacosExecuteTaskExecuteEngine还是需要详细分析一下

到这里用图总结一下从NamingSubscriberServiceV2Impl.onEvent到此处:
image.png

NacosExecuteTaskExecute.addTask

NacosExecuteTaskExecute.addTask
image.png
逻辑比较简单,先看看它有没有对应的NacosTaskProcessor,实际就是没有的(key没有,默认也没有设置),接下来就直接通过getWorker来处理

image.png
从executeWorkers中取一个TaskExecuteWorker给这个task来执行,所以我们要看一下这个executeWorkers到底是什么?
image.png
这里的TaskExecuteWorker就是一个单线程执行器

TaskExecuteWorker.process

image.png
image.png
又是似曾相识的套路,往queue里面塞东西,那具体在哪里处理的?
里面有内部单线程处理:
image.png
也就说最终还是会调用到传进来task的run方法,看到这里感觉无比的累啊,应该快结束了

到这里也拿一张图总结一下:
image.png

PushExecuteTask.run

image.png
image.png
image.png
image.png
总结一下做了几件事:

  1. 生成推送数据:generatePushData
    1. 通过serviceIndexesManger + service能找到service对应那些clientId

image.png

  1. 通过clientManger+ clientId能找到client对应的发布信息publishers,再通过publishers+service能找到这个service对应的Instance

image.png
我们来看一下实际debug得到的数据:
image.png

  1. 往serviceClusterIndex.put(service, clusters)

image.png

  1. 往serviceDataIndexes.put(service, serviceInfo)

image.png

  1. 推送给目标客户端
    1. getTargetClients: 通过ClientServiceIndexManger+ service来获取这个订阅这个service所有clientId

image.png

  1. 遍历订阅这个service的所有clientId,通过ClientManger+ clientId找到这个客户端,再通过这个客户端的subsribers+ service就能知道这个客户端订阅这个service的详情了

image.png

  1. 最后调用doPushWithCallback往订阅客户端推送数据

这篇关于全网最细的nacos服务端服务注册:没有之一的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/679249

相关文章

豆包 MarsCode 不允许你还没有女朋友

在这个喧嚣的世界里,爱意需要被温柔地唤醒。为心爱的她制作每日一句小工具,就像是一场永不落幕的浪漫仪式,每天都在她的心田播撒爱的种子,让她的每一天都充满甜蜜与期待。 背景 在这个瞬息万变的时代,我们都在寻找那些能让我们慢下来,感受生活美好的瞬间。为了让这份浪漫持久而深刻,我们决定为女朋友定制一个每日一句小工具。这个工具会在她意想不到的时刻,为她呈现一句充满爱意的话语,让她的每一天都充满惊喜和感动

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP

JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性

一、什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的。停工时间,就是不能向用户提供服务的时间。高可用,就是系统具有高度可用性,尽量减少停工时间。如何用最简单的方法来搭建一个高效率可用的服务端JAVA呢? 停工的原因一般有: 服务器故障。例如服务器宕机,服务器网络出现问题,机房或者机架出现问题等;访问量急剧上升,导致服务器压力过大导致访问量急剧上升的原因;时间和

安装SQL2005后SQL Server Management Studio 没有出来的解决方案

一种情况,在安装 sqlServer2005 时 居然出现两个警告: 1 Com+ 目录要求 2 Edition change check 郁闷!网上说出现两个警告,是肯定装不成功的!我抱着侥幸的态度试了下,成功了。 安装成功后,正准备 “ 仅工具、联机丛书和示例(T)” 但是安装不了,他提示我“工作站组件”安装过了对现有组件无法更新或升级。 解决办法: 1 打开“控

src/pyaudio/device_api.c:9:10: fatal error: portaudio.h: 没有那个文件或目录

(venv) shgbitai@shgbitai-C9X299-PGF:~/pythonworkspace/ai-accompany$ pip install pyaudio sounddeviceCollecting pyaudioDownloading PyAudio-0.2.14.tar.gz (47 kB)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Nacos Config 配置中心支持配置共享

文章目录 一、什么是配置中心二、Nacos Config2.1 Nacos Config 工作原理 (★)2.2 Nacos Config 的使用2.3 动态刷新2.4 配置共享2.4.1 同一个微服务的不同环境之间共享配置2.4.2 不同微服务中间共享配置 一、什么是配置中心 微服务架构下关于配置文件的存在以下问题: 配置文件相对分散。在一个微服务架构下,配置文件会随

html记账本改写:数据重新布局,更好用了,没有localStorage保存版本

<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>htm记账本</title><style>table {user-select: none;/* width: 100%; */border-collapse: collapse;}table,th,td {border: 1px solid bla

【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取资料的入口! 【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)「首先来看看目前已有的资料,还会不断更新哦~一次购买,后续不会再被收费哦,保证是全网最全资源,随着后续内容更新,价格会上涨,越早购买,价格越低,让大家再也不需要到处买断片资料啦~💰💸👋」�

vite是如何实现依赖预构建的,浏览器为什么没有实现从node_modules查找依赖,vite开发环境解决了什么问题

浏览器的esmodule 为什么没有做从node_modules查找依赖项 浏览器是基于http请求的,node_modules中依赖项不可控,可能又会依赖很多的包,整个依赖图都需要加载的话很耗性能。 commonjs是运行在服务端的,以file形式读取文件,内部有规避机制。 依赖预构建 首先vite会找到对应的依赖,然后调用esbuild(对js语法进行处理的一个库),将其他规范的代码转换

springboot websocket 服务端

在Spring Boot中使用WebSocket实现服务端和Java客户端的实时通信,可以分为几个步骤来完成。这里将详细介绍服务端和Java客户端的具体实现。 服务端设置 添加依赖: 在pom.xml文件中添加Spring WebSocket的依赖。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spr