Nacos服务注册底层原理方法调用过程分析(基于自研协议Distro协议下的AP一致性架构临时实例场景下)
2021-09-08 11:20:17 0 举报
登录查看完整内容
Nacos服务注册和发现底层原理源码方法调用过程分析
作者其他创作
大纲/内容
Registration填充到Instance对象
doInvokeListener方法
1:从pair中获取datumKey
invokeListener方法
二:根据namespaceId找到对应的注册中心,然后将service注册进去
三:将最终的更新好的注册表副本重新赋值给注册表
否(CP架构)
ApplicationEventMulticaster接口
AbstractAutoServiceRegistration抽象类
DelegateConsistencyServiceImpl实现类
5:调用注册实例方法namingService.registerInstance
①检查实例instance的合法性
一:namespaceId在注册表serviceMap中是否存在?
否
ephemeral为true
获取服务列表chooseServiceMap(namespaceId).get(serviceName);
思考:为什么要1:将实例先放到阻塞队列中,然后2:notifier线程不断的从队列中取出来异步处理呢?有什么好处
2:将心跳对象和groupedServiceName放入BeatReactor定时线程池中,默认5秒发送一次心跳到NacosServer中
Notifier线程run方法
ApplicationListener函数式接口
bind方法
⑥通过nacosRestTemplate封装的rest风格的Http服务注册请求nacosRestTemplate.exchangeForm
通过api映射到NacoServer下nacos-naming中InstanceController中的register方法
返回null
将新的service放入注册表并且初始化putServiceAndInit
3:将request转换为Instance实例parseInstance(request)
写时复制原理(copyOnWrite)
一方面可以削峰,多个节点同时注册时,会有很高的并发量另一方面通过异步任务循环取队列中数据再注册,可以降低注册时间
2:ip删除超时时间小于心跳间隔时间
如果是临时实例,则返回ephemeralConsistencyService(默认),否则持久化实例persistentConsistencyService
真正将实例存入注册表中地方
是(AP架构)
思考:ephemeral为true代表什么?临时实例和持久实例是什么?对服务注册和发现有什么影响?
Cluster.java
1:心跳对象创建BeatInfo
DELETE
删除实例
b:namespaceId在注册表serviceMap中是否存在?
4:listener.onDelete(datumKey);
NacosNamingService实现类
nacosUrlInstance
registerListeners();
3:数据变动后将变动信息放入监听器中
注册表serviceMap中namespaceId不存在?
3:获取服务组group
创建新的Service
②将service存入到对应的clusterMap中
③对集群cluster进行初始化,即将cluster放到健康检查线程池中,如果集群已经初始化了,则不用再初始化了
②getService
ServiceRegistry接口
⑤调用reqApi方法font color=\"#ff0000\
1:将实例存入到Datum<Instances> datum中 datum.value = (Instances) value; datum.key = key;
NamingService接口(NacosServer提供的api接口)
好处在于可以很好的实现读写分离,不会出现多节点并发注册冲突问题
b:添加ip地址,返回所有的实例列表
action类型
register方法
④心跳
思考:为什么更新实例Instance时,采用的是先复制注册表中的Set<Instance>为一个副本oldIpMap,更新完之后再重新赋值给注册表Set<Instance>?
EphemeralConsistencyService
一:font color=\"#ff0000\
服务启动
onApplicationEvent方法
key
ConsistencyService
①onPut(key,value);
5:调用注册实例方法registerInstance
1:获取namespaceId
params参数
二:将新的ips更新到注册表的副本oldIpMap中
实例注册的核心入口
1:putService(service);将新服务注册到注册表的地方
1:实例的心跳超时时间小于心跳间隔时间
multicastEvent方法
是
mapConsistencyService(key)
CHANGE
两个条件满足其一都不合法
一:将datumKey存入servicesMap中
③是否为临时实例
解释:复制的是Set<Instance> ephemeralInstances集合,而这个集合是Cluster中的属性,也是注册表中Service中的属性
类似于redis后台持久化时执行bgsave命令主线程fork一个bgsave子进程来执行客户端命令,当执行bgsave进行写操作持久化时,客户端也对内存进行写操作,这时客户端操作的那一块内存区域会创建一个副本,bgsave针对这一块副本进行持久化
更新实例
start方法
注册表font color=\"#ff0000\
通过NamingFactory工厂利用反射机制创建
4:获取实例InstancegetNacosInstanceFromRegistration
SimpleApplicationEventMulticaster实现类
三:handle(pair);
ServiceManager调用
serviceRegistry.register(getRegistration())
NacosServer
createServiceIfAbsent方法
②通过distro协议将注册的服务同步集群中所有的server
①createEmptyService
④注册服务NamingProxy.registerService
a:对service加同步锁synchronized
2:获取服务Id serviceId
②服务组和服务名使用@@封装groupName + \"@@\" + serviceName
com.alibaba.nacos.naming.domains.meta.ephemeral+namespaceId+##+serviceName
临时实例
3:从serviceMap中删除datumKey
e:span style=\"font-size: inherit;\
2:init(service);初始化服务
期间涉及一些健康检查之类的操作
表示将存放了key和实例Instances的datum放入阻塞队列后,notifier线程从服务启动开始就在循环的获取队列中的datumKey
1:获取NacoeServer提供的api接口NamingService
/nacos//v1/ns/instance
getService
AbstractApplicationContext.class
①对当前初始化的service进行健康检查(将service丢到健康检查线程池NAMING_HEALTH_EXECUTOR中)
refresh方法
NacosServiceRegistry实现类
2:获取serviceName
a:在putServiceLock这个Object对象上加一把synchronized同步锁
5:调用Cluster中的updateIPs方法
2:从pair中获取action,默认为change
NacosClient
0 条评论
回复 删除
下一页