/***************************************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`;