Nacos
2022-04-13 19:48:12 4 举报
初试Nacos,仅供参考
作者其他创作
大纲/内容
service#init
instance.setHealthy(true)
AbstractAutoServiceRegistration#onApplicationEvent
SH-Cluster
DELETE /nacos/v1/ns//instance?paramparam -> 待删除实例的信息
心跳检测:nacos client每间隔一段时间(设置心跳间隔时长)发送一次请求到nacos server,更新该实例的最后心跳时间(当前时间戳)。 如果此前该实例已经是非健康状态,则修改状态为健康,并通知nacos client服务实例信息发生变更服务注册:nacos client注册实例到nacos server,先创建Service,并将Service维护到nacos server服务注册表serviceMap中; 开启固定delay5S轮训的定时任务(对心跳超时的实例做状态修改和下发通知、对超过删除超时设定的实例做服务剔除); 将Service.clusterMap内维护的实例列表和dataStore.dataMap中维护的实例列表进行比对修改后,将新注册的实例加入, 最终将最新的实例列表重新维护到dataStore.dataMap中。将修改的实例列表对应的KEY加入任务队列,这个队列通过自旋 来处理,根据KEY可以从dataStore.dataMap中获取到instanceList。随后做服务实例信息变更下发给指定nacos client 列表。。。服务剔除:定时轮训将超出删除时长的实例获取出来 将Service.clusterMap内维护的实例列表和dataStore.dataMap中维护的实例列表进行比对修改后,将待删除的实例移除, 最终将最新的实例列表重新维护到dataStore.dataMap中。将修改的实例列表对应的KEY加入任务队列,这个队列通过自旋 来处理,根据KEY可以从dataStore.dataMap中获取到instanceList。随后做服务实例信息变更下发给指定nacos client 列表。。。nacos client 在启动时在PushReceiver中开启了一个线程(内部维护了udp.receive),用来处理nacos server下发的服务实例信息变更拉取服务列表:懒加载模式,可以通过ribbon.earge-load.clients设置为饥饿加载 先从本地缓存serviceInfoMap中获取,不存在,通过http调用nacos server端获取,将拉取的数据存入本地缓存serviceInfoMap中, 轮训通过线程池执行任务(通过调用nacos server来维持本地缓存中的服务的新鲜度)
delay心跳时间执行任务
实例初始化标记为true
InstanceIP4
POST /nacos/v1/ns/instance
NamingProxy
true
通知Nacos Client服务实例信息发生变更
buildParam
#register
当前实例非健康
Notifier#addTask
InstanceIP3
设置服务心跳时间
putServiceAndInit
处理拉取到的服务实例json
NameSpace
true#buildBeatInfoo
SpringApplication#run
addInstance
Pair
GET /nacos/v1/ns/instance/list
clientMap
通知Nacos Client服务实例信息变更
将不可用的实例删除
false
scheduleUpdateIfAbsent#创建UpdateTask -> 丢给线程池 -> delay1s -> UpdateTask#run(死循环)
#list
listen
默认错误重试三次三次都失败,抛异常
putService
DistroConsistencyServiceImpl#init
获取DataStore.dataMap维护的Datum(Datum.value -> Instances -> instanceList)获取Service.clusterMap.Cluster内部维护的实例列表根据Service内的实例列表更新Datum内的实例列表数据健康状态、最后心跳时间维护注册实例对应clusterName到Service.clusterMap中若注册实例在Datum维护的实例列表中存在,则采用原实例id,否则获取一个新实例id,并将注册实例加入到Datum维护的实例列表中返回最新实例列表=》instanceList
区别为蓝色字体
#deregister
nameSpaceserviceNameinstanceephemeral
buildInstanceListKey
Pair.with(key,“CHANGE”)
getNacosInstanceFromRegistration#构建实例Instance
实例心跳是否超时
发送心跳
keycom.alibaba.nacos.naming.iplist.ephemeral.f838edbb-a0b0-4667-b44a-bf4850069554##DEV_GROUP@@orderService
ephemeral
获取DataStore.dataMap维护的Datum(Datum.value -> Instances -> instanceList)获取Service.clusterMap.Cluster内部维护的实例列表根据Service内维护实例列表更新Datum内维护实例列表数据的健康状态、最后心跳时间维护注册实例对应clusterName到Service.clusterMap中从Datum维护的实例列表中移除剔除的实例返回最新实例列表=》instanceList
服务续约
RaftCore#listen。。。
Service#onChange(key,Instances)
BeatReactor
Nacos-Client
ScheduledExecutorService#schedule
固定delay5S轮训执行任务
步骤一
serverProxy#queryList
实例注册
注册
take
udp#receive
System.currentTimeMillis() - instance.getLastBeat() > instance.getIpDeleteTimeout()
缓存discovery配置信息
ArrayBlockingQueue
updateService
PUT /nacos/v1/ns/instance/beat
自旋获取task
二、从clusterMap中获取Cluster,进而获取instanceList根据clusterName从Service.clusterMap中获取Cluster,从Cluster中获取实例列表遍历所有实例,ip、port均匹配的实例设置心跳时间
待删除实例的信息
publishEvent
serviceMap -> Service -> instanceList
FeignClient
selectInstances#移除非健康、权重<0的实例。。。
parseParamnameSpace、serviceName、instance
InstanceController
心跳
onApplicationEvent
移除IP地址代表剔除
InstanceIP2
HTTP调用Nacos-Server
ClientBeatCheckTask#run
PushClient
当前实例健康
服务剔除
HostReactor#processServiceJson
listeners.containsKey(key)
Map<namespace,Map<group@@serviceName,Service>> serviceMap
instance.setLastBeat(System.currentTimeMillis())
serviceMap -> Service
创建Service
Service(库存服务)
DistroConsistencyServiceImpl#listen
serviceInfoMap缓存
CloseableHttpAsyncClient#execute
步骤二
使用nacos client信息、拉取服务信息构建一个PushClient对象,注册到clientMap中。目的:当nacos server端服务实例信息发生变更时,可以从clientMap知道有哪些nacos client引用了该服务实例,然后做相应的下发通知
一、从serviceMap中获取Service根据namespace、group@@serviceName从serviceMap中获取Service
InstancePreRegisteredEvent
addIpAddresses
开始心跳、实例注册、服务列表
ClientBeatCheckTask#deleteIp(instance)
instance.setHealthy(false)
ScheduledExecutorService#scheduleWithFixedDelay
很重要!很重要!很重要!
Nacos-Server
PushService#serviceChanged(service)
处理心跳、注册实例
实例不可用
ClientBeatProcessor#run
根据namespace、serviceName找到对应nacos client列表,通过udp方式将变更的服务实例信息下发给nacos clientnacos client 一直运行着一个接收端,用来处理服务实例信息变更
Service(订单服务)
NacosServiceRegistry#register
sendBeat
createEmptyService
Group
将最新实例列表重新维护到dataMap中
dataStore#put
延时1s执行任务
ServiceManage#registerInstance
通过反射构建NacosNamingService时,需要HostReactor,构建HostReactor时,span style=\"font-size: inherit;\
BeatTask#run
hostReactor#getServiceInfo
addBeatInfo
serviceManager#removeInstance
doSrvIpxt
HostReactor
Service#updateIPs
SZ-Cluster
InstanceRegisteredEvent
步骤三
#reqApi#callServer
立即执行任务
将ServiceInfo存入serviceInfoMappublishEvent ->InstancesChangeEvent将ServiceInfo存入本地磁盘
InstanceIP1
获取服务列表(lazy)
NacosNamingService#registerInstance
listeners.get(key)
serviceInfoMap -> ServiceInfo
ServiceChangeEvent
PushReceiver#run
substractIpAddresses
Notifier#run
offer
NacosNamingService#selectInstances
将Service放入serviceMap
publishEvent#InstanceHeartbeatTimeoutEvent???
pushService#addClient
ServletWebServerInitializedEvent
不存在
监听nacos server下发的服务实例变更通知
Service#processClientBeat
实例删除
service#allIPs(true)
服务列表
#beat
handle
添加IP地址代表上线
最终根据实例列表拿到最优的Instance,通过其IP、Port进行服务调用
Nacos-Server服务注册表(ServiceManager)
InstancesdataStore.dataMap.get(key).value => Datum.value=> Instances(这是最新的服务列表)
System.currentTimeMillis() - instance.getLastBeat() > instance.getInstanceHeartBeatTimeOut()
获取Service内部维护的所有临时实例
服务注册
服务发现
存在
@PostConstruct
NacosRule#choose
registerService
udp#send
0 条评论
回复 删除
下一页