Nacos-Client服务注册 https://blog.csdn.net/CSDN877425287/article/details/122281847
Nacos-服务端服务注册 https://blog.csdn.net/CSDN877425287/article/details/122311315
Nacos-服务发现 https://blog.csdn.net/CSDN877425287/article/details/122321515
server主动push UDP协议
client轮询,每隔10s Http协议
数据一致性协议:包含distro(AP)和raft(CP)协议,任意一节点数据变化,通过http接口异步通知
客户端可通过ephemeral来指定,dubbo默认使用的是true,使用distro协议
0 dubbo的原理图(图不错)
1 Service对象数据结构
ehemeralInstances: 临时实例列表,dubbo默认是这个, 一致性协议使用distro
persistentInstances: 持久化实例列表, 一致性协议使用raft
重点:所有service维护在一个serviceMap中,不同的nacos server数据都一样,都有心跳检查任务(只是hash分片,执行对应的service心跳检查任务)
2 naming相关接口(InstanceController)
2.1 实例注册接口
POST /nacos/v1/ns/instance Method: register
创建Service对象,包含ClientBeatCheckTask(实现Runable接口)对象 ,具体内容见上图
创建ClientBeatCheckTask对象对应的定时任务
更新本地缓存数据,并使用UDP协议通知订阅该服务的客户端(异步)
使用/nacos/v1/ns/distro/datum接口通知其他server节点(异步)
2.2 实例注销接口
DELETE /nacos/v1/ns/instance Method: deregister
更新本地缓存数据,并使用UDP协议通知订阅该服务的客户端(异步)
使用/nacos/v1/ns/distro/datum接口通知其他server节点(异步)
2.3 实例心跳接口
PUT /nacos/v1/ns/instance/beat Method: beat
当服务不存在时,重新注册服务
更新服务实例的心跳时间(续期)
2.4 获取服务实例列表
GET /nacos/v1/ns/instance/list Method: list
订阅该服务,同时上传udp的端口和客户端ip
获取服务实例列表(保护阈值该参数这里有处理)
3 不同的key有何区别
nacos server 通过判断key的值(是否以com.alibaba.nacos.maing.iplist.ephemneral为前缀)来判断走distro还是raft协议
代理类: DelegateConsistencyServiceImpl
以注册到后台的service名字为:providers@com.myhexin.ifund.dubbo.interface.TestService为例
service_meta_key: com.alibaba.nacos.naming.domain.meta.{namespace}##DEFAULT_GROUP@@providers:com.myhexin.ifund.dubbo.interface.TestService:1.0.0:group
临时服务实例key: com.alibaba.nacos.naming.iplist.ephemeral.{namespace}##DEFAULT_GROUP@@providers:com.myhexin.ifund.dubbo.interface.TestService:1.0.0:group
持久化服务实例key: com.alibaba.nacos.naming.iplist.{namespace}##DEFAULT_GROUP@@providers:com.myhexin.ifund.dubbo.interface.TestService:1.0.0:group
distro协议实现类:DistroConsistencyServiceImpl
listeners
- "com.alibaba.nacos.naming.domain.meta.": ServiceManager
- 临时服务实例key "com.alibaba.nacos.naming.iplist.ephemeral.{namespace}##DEFAULT_GROUP@@providers:com.myhexin.ifund.dubbo.interface.TestService:1.0.0:group": Service
raft协议实现类:RaftConsistencyServiceImpl
listeners
- "com.alibaba.nacos.naming.domain.meta.": ServiceManager
- 持久化服务实例key “com.alibaba.nacos.naming.iplist.{namespace}##DEFAULT_GROUP@@providers:com.myhexin.ifund.dubbo.interface.TestService:1.0.0:group”: Service
- service_meta_key "com.alibaba.nacos.naming.domain.meta.{namespace}##DEFAULT_GROUP@@providers:com.myhexin.ifund.dubbo.interface.TestService:1.0.0:group": Service
dubbo服务实例注册和注销接口 key为: serviceName
服务实例注册:
DistroConsistencyServiceImpl监听对应的临时服务实例key
RaftConsistencyServiceImpl监听对应的持久化服务实例key
因为dubbo的ephemeral值为true,通知其他节点使用的一致性协议为distro, 接口/nacos/v1/ns/distro/datum(见DistroConsistencyServiceImpl#put)
服务实例注销
跟服务实例注册一样,调用的是DistroConsistencyServiceImpl#put
nacos后台服务列表删除服务功能和定时任务检查服务实例为空,都是调用 ServiceManager#easyRemoveService
删除服务key: service_meta_key "com.alibaba.nacos.naming.domain.meta.{namespace}##DEFAULT_GROUP@@providers:com.myhexin.ifund.dubbo.interface.TestService:1.0.0:group"
版权声明:《 nacos服务注册与发现 》为Saber原创文章,转载请注明出处!
最后编辑:2022-9-15 10:09:49