Nacos+Ribbon流程图
2024-11-14 11:01:24 0 举报
Nacos原理核心流程
作者其他创作
大纲/内容
后续需要自己去看
AbstractAutoServiceRegistration
chooseServer
容器启动发布事件
真正负载均衡获取服务
【视频地址】 https://www.bilibili.com/video/BV19U4y1t72g?p=9&spm_id_from=pageDriver&vd_source=21b35e0a238cdaf3c99792febb1de5e0
参数
service.processClientBeat(clientBeat)
serverListImpl.getUpdatedListOfServers();
getInstanceOperator().registerInstance
SpringBoot入口
createEmptyService
if (dataSize == partitionConfig.getBatchSyncKeyCount() || (System.currentTimeMillis() - lastDispatchTime) > partitionConfig.getTaskDispatchPeriod())【按照配置数量和事件两种机制去做集群之间的同步】
nacosServiceRegistry
Ribbon三个组件
服务发现源码入口
然后进入【hostReactor.getServiceInfo】对接起Nacos
线程池心跳任务executorService.schedule
线程run方法里面处理上面添加进去的task
serviceManager.registerInstance【再次注册】
不是leader
finishRefresh
此处有个CAS机制
API里面怎么操作后面在看
/instance【最终调用此API】
ribbonLoadBalancer
持久化模式
PollingServerListUpdater
PushService
时间超过15秒则将实列设置为false
临时实列模式
spring.factories
将获取到的serverList放到负载均衡器里
右侧为从Nacos获取server相关的内容
serverProxy.sendBeat调用Nacos的API发心跳包
后续补充
实现
addInstance
HealthCheckStatus.reset(ip);健康检查重置当前实列
doInvokeListener
集群同步
raftStore.write(datum);【先写磁盘】
RibbonClientConfiguration
这个事件发布是干啥的
raftProxy.proxyPostLarge
NacosAutoServiceRegistration
listener.onChange
/beat【最终调用此API】
ping
nacosRegistration
register
从缓存获取
listener.onApplicationEvent(event);【spring 发布事件】
refresh()
更新最后心跳时间
updateListOfServers
视频将 会调回这里
PredicateBasedRule
从视频里面看,API的实现是重新回去调用这个方法
NacosNamingService.getAllInstances
updateAllServerList(servers);
serverListUpdater.start(updateAction);
run
同步其他集群
publishEvent(new ContextRefreshedEvent(this));
成员变量
最开始入口找不到
获取到具体执行的那个实例
【初始化】loadBalancedRestTemplateInitializerDeprecated
NacosServiceRegistryAutoConfiguration
loadBalancer.execute
/instance/list
intercept
【内部类】RetryAutoConfiguration
retrySync(syncTask)不成功--》去重试
getPushService().serviceChanged(service)
否
使用并发编程工具门闩集群写成功半数以上,则成功。类似zookeeper两阶段提交
upServerList = allServerList;
incrementAndGetModulo(eligible.size()))
ZoneAwareLoadBalancer
【初始化】loadBalancedRetryFactory
RaftStore.loadDatums
服务端挂了重启的情况下会有用,心跳触发重新注册
ribbonServerList
HealthCheckReactor.scheduleNow(clientBeatProcessor);
setServersList(ls);
走Nacos【看的时候没有包】通过NamingService获取具体实列
taskDispatcher.addTask(key)【1.14版本】
发布一个Spring事件
缓存没有
new ZoneAwareLoadBalancer
getLoadBalancer
rule
loadBalancer.chooseServer
拿全部实列去循环,回归到心跳主线
/distro/datum【最终调用此API】
DistroConsistencyServiceImpl
HealthCheckStatus.remv(ip);健康检查移除当前实列
bind
此处使用copyOnWrite去处理更新并且替换,这种方式可以避免读写并发冲突【实列的增删都在这个方法操作】
【内部类】LoadBalancerInterceptorConfig
serviceManager.getService
自动注册源码入口【基于1.14版本】
默认是
InstanceController类: beat
TaskScheduler.run
chooseServiceMap(namespaceId).get(serviceName)
服务初始化会启动心跳检查线程service.init()
Ribbon
如果超过30秒走实列删除
serviceMap.get(namespaceId)
【初始化】ribbonInterceptor
protected final ServerListUpdater.UpdateAction updateAction = new ServerListUpdater.UpdateAction() { @Override public void doUpdate() { updateListOfServers(); } };
onApplicationEvent
【初始化】restTemplateCustomizer
DynamicServerListLoadBalancer
taskSchedulerList.get
synchronized 单线添加consistencyService.put
pushService.canEnablePush【往客户端推数据】
enableAndInitLearnNewServersFeature();
super.chooseServer(key)
instance.setLastBeat(System.currentTimeMillis())
写内存
ApplicationListener
RaftCore.MasterElection【选举】
ClientBeatCheckTask的run
Ribbon定时更新NacosNacos实例列表
LoadBalanced
rule.choose(key)
DelegateConsistencyServiceImpl
RaftConsistencyServiceImpl
健康检查
hostReactor.getServiceInfo
BaseLoadBalancer
deleteIP(instance)
这个接口调用实现从哪里得知是service的
request.getURI()
getService
putServiceAndInit(service);
广播事件
【初始化】loadBalancerRequestFactory
【通过负载均衡器获取全部服务】getLoadBalancer()
存入一个serviceMap中putService(service)
start
集群选举的问题
LoadBalancerAutoConfiguration
InstanceController.register
HealthCheckReactor.scheduleCheck(clientBeatCheckTask)
checkServiceIsNull
notifier.addTask添加一个线程任务到阻塞队列
namingService.registerInstance
distroProtocol.sync【自己的代码走这个方法】
构建并添加心跳包beatReactor.addBeatInfo
getServer(loadBalancer)
getPushService().serviceChanged(this)【发布一个事件】
同步核心代码
继承
serviceManager.registerInstance
ApplicationListener【springCloud对事件监听】
compareAndSet
进入Nacos服务端
handle(pair)
updateListOfServers();
prepareHostsData(client)
originalUri.getHost()
UpdateTask【异步更新线程】
Post请求
同一个方法
spring.factory
获取负载均衡器
是leader
【内部类】RetryInterceptorAutoConfiguration
新版本
serverProxy.registerService
protected volatile List<Server> upServerList = Collections .synchronizedList(new ArrayList<Server>());
updateAction.doUpdate();
doSrvIPXT
调用Nacos的API注册
put
是否为临时节点Ephemeral
restOfInit(clientConfig);
具体实现
0 条评论
下一页