Nacos2.1.0 2.2.3服务注册流程分析

devtools/2024/10/19 5:30:58/

/***************************************nacos2.1.0集群后台任务***************************************/

1.集群节点服务状态报告。
当前节点把本机的IP、权重循环调用其它节点通知。
ServerListManager.ServerStatusReporter

2.定时从集群其它节点获取它们的详细信息,做集群选举。
ServerListManager.ServerInfoUpdater

类似是在做集群选举。

{"ip":"10.6.33.23:8817","term":0,"leaderDueMs":6418,"heartbeatDueMs":500,"state":"FOLLOWER"}

{"ip":"10.6.33.23:8827","voteFor":"10.6.33.23:8827","term":1,"leaderDueMs":14490,"heartbeatDueMs":2000,"state":"CANDIDATE"}

3.Distro协议启动时会从集群其它节点获取分布式存储的注册表信息。
DistroProtocol.DistroLoadDataTask

4.本节点注册信息变化时会循环通知其它节点进行数据更新。
DistroDelayTaskProcessor.DistroSyncChangeTask

5.  2.x的兼容1.X升级判断,判断从1.X升级到2.X是否完成,双写是否结束。
UpgradeJudgement.initUpgradeChecker

6.监听本机节点V1注册表信息变化,然后根据V2协议重新注册一遍,即为双写。
DoubleWriteEventListener.DoubleWriteEnabledChecker

ClientServiceIndexesManager.addPublisherIndexes或者 NamingSubscriberServiceV2Impl.onEvent
 NotifyCenter.publishEvent(new ServiceEvent.ServiceChangedEvent(service, true));
 DoubleWriteEventListener.onEvent
 ServiceChangeV2Task
 DoubleWriteInstanceChangeToV1Task  -->往V1协议也重新写一遍。
 

6.外部数据存储初始化
ExternalDumpService.init

7.GRPC服务端
GrpcSdkServer.start  -->  接收客户端的GRPC请求。
GrpcClusterServer.start--> 接收集群节点相互调用的GRPC请求。
GRPC --》RequestFilters 过滤器
RequestHandler 通用处理器
ServiceListRequestHandler 服务列表查询HANDLER


/***************************************nacos2.2.3集群后台任务***************************************/
注册表存储结构

ConcurrentHashMap<String, Set<Service>> ServiceManager>   namespaceSingletonMaps 
--> 存储命名空间和服务对象列表。但不包括具体的IP,端口等实例信息,以及元数据信息。 
ConcurrentHashMap<Service, InstancePublishInfo> AbstractClient.publishers 
--》存储服务与具体的实例IP,端口,元数据映射关系。代表一个实际的物理主机客户端,标识为一个TCP CLIENT

ClientServiceIndexesManager ConcurrentMap<Service, Set<String>> publisherIndexes 
--》存储服务与具体的客户端ID列表的映射关系。


NamingMetadataManager  ConcurrentMap<Service, ServiceMetadata> serviceMetadataMap
--》存储服务与服务的元数据信息。


NamingMetadataManager ConcurrentMap<Service, ConcurrentMap<String, InstanceMetadata>> instanceMetadataMap
--》存储服务与对应实例列表的元数据信息。

读取服务列表的步骤
1.从namespaceSingletonMaps获取服务信息。
2.从publisherIndexes获取服务对应的具体客户端ID列表。
3.从publishers中获取某个客户端具体的实例详情,包括IP,PORT等。
4.从serviceMetadataMap中或者从InstancePublishInfo中 获取服务元数据。
5.从instanceMetadataMap中或者从InstancePublishInfo中 获取实例元数据。


服务注册的流程:
1.GRPC的CLIENT连接管理 --》  ConnectionBasedClientManager.clientConnected
会接收GRPC新的网络连接通道,然后根据客户端的信息生成CLIENT。

2.收到客户端GRPC的请求处理  
InstanceRequestHandler.handle

3.会对namespaceSingletonMaps注册服务
ServiceManager.getSingleton
 NotifyCenter.publishEvent(new MetadataEvent.ServiceMetadataEvent(service, false));
 同时首次广播了服务元数据事件
 
4.获取当前连接的对应客户端信息
ConnectionBasedClientManager.getClient  --》ConnectionBasedClient

5.向ConnectionBasedClient添加实例发布信息
ConnectionBasedClient.addServiceInstance 
同时会向publishers中追加记录。
 NotifyCenter.publishEvent(new ClientEvent.ClientChangedEvent(this));
 此客户端事件由DistroClientDataProcessor接收,广播给集群其它节点
 
 
6.发送客户端服务注册事件 
EphemeralClientOperationServiceImpl.registerInstance
NotifyCenter.publishEvent(new ClientOperationEvent.ClientRegisterServiceEvent(singleton, clientId));

7.客户端服务索引管理器监听 ClientRegisterServiceEvent 事件,保存服务与客户端ID的关系。
ClientServiceIndexesManager.handleClientOperation
保存到ClientServiceIndexesManager.publisherIndexes中。

遗留问题:
springboot第一次注册失败后,就不会再次注册GRPC客户端了,导致注册中心没有记录,必须重启客户端服务才行。


/***************************************nacos2.0.4数据库表结构升级到2.2.3***************************************/
ALTER TABLE `config_info` ADD COLUMN `encrypted_data_key`  text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '秘钥' AFTER `c_schema`;
ALTER TABLE `config_info_beta` ADD COLUMN `encrypted_data_key`  text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '秘钥' AFTER `tenant_id`;
ALTER TABLE `his_config_info` ADD COLUMN `encrypted_data_key`  text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '秘钥' AFTER `tenant_id`;


 


http://www.ppmy.cn/devtools/125107.html

相关文章

大数据毕业设计选题推荐-B站热门视频数据分析-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

7、Spring Boot 3.x集成RabbitMQ动态实例等操作

一、前言 本篇主要是围绕着 Spring Boot 3.x 与 RabbitMQ 的动态配置集成&#xff0c;对比上一篇文章&#xff0c;进一步集成RabbitMQ动态操作&#xff0c;比如动态新增 RabbitMQ 实例&#xff0c;以及动态实例中的交换机、队列等操作。二、动态RabbitMQ实例&#xff0c;创建、…

L1 Sklearn 衍生概念辨析 - 回归/分类/聚类/降维

背景 前文中我们提到&#xff1a; Scikit-Learn 库的算法主要有四类&#xff1a;分类、回归、聚类、降维&#xff1a; 回归&#xff1a;线性回归、决策树回归、SVM回归、KNN 回归&#xff1b;集成回归&#xff1a;随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees。…

ESP32-C3实现网页显示ADC的电压-(改进版)

源码 #include <WiFi.h> #include <WebServer.h>// 替换为你的WiFi网络名称和密码 const char* ssid "123"; const char* password "1234678901";WebServer server(80); // 创建一个Web服务器对象&#xff0c;监听80端口// 定义ADC引脚 co…

桶排序(Bucket Sort)

桶排序&#xff08;Bucket Sort&#xff09;是一种用于排序的算法&#xff0c;适合于分布均匀的数值数据。其基本思路是将数据分到有限数量的桶中&#xff0c;每个桶再单独进行排序&#xff0c;最后将各个桶中的元素合并起来。 桶排序首先要确认桶的数量。桶的数量应该与待排序…

Java后端面试题(day16)

目录 java常见的引用类型java中深拷贝和浅拷贝如何设计一个秒杀系统?谈一下对高并发的理解&#xff0c;平时怎么处理高并发问题?Comparable和Comparator区别&#xff1f;解决hash冲突有哪些方法&#xff1f;Synchronized锁的升级过程 java常见的引用类型 java的引用类型一般分…

Python 工具库每日推荐 【BeautifulSoup】

文章目录 引言Python工具库的重要性今日推荐:BeautifulSoup工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例获取 BeautifulSoup 官网文档首页的标题与所有图片案例分析扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript 设计模式 专栏…

【机器学习】金融预测 —— 风险管理与股市预测

我的主页&#xff1a;2的n次方_ 在金融领域&#xff0c;机器学习&#xff08;ML&#xff09;已经成为了不可或缺的工具。金融预测&#xff0c;尤其是风险管理和股市预测&#xff0c;涉及海量数据和复杂模式的分析&#xff0c;而这些正是机器学习擅长处理的领域。通过分析历…