向Nacos注册服务,存在两种类型。临时(Ephemeral)服务和持久(Persistent)服务。服务信息的存储和节点间同步,分别基于Distro协议和Raft协议。
Distro协议
可以从DistroClientComponentRegistry入手去阅读源代码,下面这些成员变量,都是用来实现协议的。
- ServerMemberManager 服务端成员管理器,有3种模式分别是:从磁盘文件读取,从指定地址读取,单点模式
- DistroProtocol
- DistroComponentHolder 各组件组合器
- DistroTaskEngineHolder task任务异步执行器
DistroProtocol
看下来主要有两个功能点
1 | private void startDistroTask() { |
startVerifyTask()
startVerifyTask()
-> DistroVerifyTimedTask#run()
-> DistroVerifyExecuteTask#run()
发送方,发送:
获取当前节点所有客户端信息,获取所有Nacos Server节点。将客户端信息发送到所有节点,进行校验。我们看下具体校验逻辑是啥?
接收方,校验逻辑:
DistroDataRequestHandler#handle()
->handleVerify()
->DistroProtocol#onVerify()
->DistroClientDataProcessor#processVerifyData()
->EphemeralIpPortClientManager#verifyClient(*)
比较一下内存中版本号,如果版本号不一致,就更新内存中服务实例信息。
发送方,处理校验结果:
DistroVerifyCallbackWrapper#onResponse(*)
1 | public void onResponse(Response response) { |
除了记录log和metric,就是发布了一个ClientEvent.ClientVerifyFailedEvent事件。该事件最终触发同步数据请求,发送到校验失败的服务器。
收到请求后的处理逻辑在这里:
DistroDataRequestHandler#handle()
->handleSyncData()
-> DistroProtocol#onReceive()
-> DistroClientDataProcessor#handlerClientSyncData() ->upgradeClient(*)
1 | private void upgradeClient(Client client, ClientSyncData clientSyncData) { |
这里显示将收到的数据进行封装,然后维护更新内存种数据。同时发出了3个事件:
- ClientRegisterServiceEvent //通知订阅者更新服务实例信息
- InstanceMetadataEvent //维护更新内存的Metadata
- ClientDeregisterServiceEvent //维护内存数据,通知订阅者更新服务信息
startLoadTask()
1 | private void load() throws Exception { |