一棵逊、Nacos的核心要點(diǎn)
服務(wù)注冊(cè):Nacos Client通過發(fā)送請(qǐng)求的方式万矾,向Nacos Server注冊(cè)自己的服務(wù)肥照,同時(shí)客戶端提供元數(shù)據(jù)、IP地址勤众、端口等信息。Nacos Server接收到client的請(qǐng)求之后鲤脏,會(huì)把該實(shí)例注冊(cè)到內(nèi)存中的注冊(cè)表(Map)中们颜。
服務(wù)心跳:(2.1使用了grpc長(zhǎng)鏈接方式,因此變成服務(wù)端檢查客戶端心跳)nacos 1.4中在服務(wù)注冊(cè)成功后猎醇,Nacos client會(huì)維護(hù)一個(gè)定時(shí)心跳來持續(xù)通知Nacos Server窥突,說明當(dāng)前Nacos Client一直處于運(yùn)行中,防止被Nacos Server剔除硫嘶。Nacos Client默認(rèn)5s發(fā)送一次心跳信息阻问。
服務(wù)端健康檢查:Nacos Server開啟一個(gè)定時(shí)任務(wù),每隔3s執(zhí)行一次沦疾。Nacos Client超過20s沒有發(fā)送心跳給Nacos Server称近,Nacos Server將發(fā)送請(qǐng)求探活,探活失敗后將該Client剔除哮塞。
服務(wù)的發(fā)現(xiàn):Nacos 2.1中新增了服務(wù)的訂閱功能刨秆,Nacos Client在獲取服務(wù)端注冊(cè)表的數(shù)據(jù)時(shí),會(huì)默認(rèn)訂閱該服務(wù)忆畅,Nacos Client會(huì)定時(shí)查詢注冊(cè)表數(shù)據(jù)并更新到本地副本中衡未,默認(rèn)6s一次。如果訂閱的服務(wù)有變動(dòng)家凯,Nacos Server也會(huì)主動(dòng)推送給所有訂閱該服務(wù)的Client缓醋。
服務(wù)的同步:Nacos Server集群之間會(huì)互相同步服務(wù)實(shí)例,用于保證服務(wù)信息的一致性绊诲。
二送粱、Nacos Client向服務(wù)端注冊(cè)實(shí)例
2.1 Nacos Client發(fā)送注冊(cè)請(qǐng)求
首先找到Nacos Client的自動(dòng)配置類:2.2 Nacos Server處理客戶端的注冊(cè)請(qǐng)求
InstanceRequestHandler#registerInstance將處理客戶端注冊(cè)實(shí)例的請(qǐng)求:然后EphemeralClientOperationServiceImpl#register方法會(huì)把實(shí)例信息添加到注冊(cè)表中驯镊,接著會(huì)發(fā)布ClientEvent.ClientChangedEvent葫督、ClientOperationEvent.ClientRegisterServiceEvent竭鞍、MetadataEvent.InstanceMetadataEvent這三個(gè)事件。
2.3 當(dāng)服務(wù)端注冊(cè)表發(fā)生改變時(shí)橄镜,會(huì)主動(dòng)推送數(shù)據(jù)
NacosDelayTaskExecuteEngine在這個(gè)類中偎快,會(huì)去處理變動(dòng)的服務(wù),并推送給所有訂閱了該服務(wù)的客戶端洽胶。
三晒夹、客戶端獲取服務(wù)端最新的注冊(cè)表
3.1 客戶端發(fā)起請(qǐng)求
入口在NacosNamingService.selectInstances()3.2 服務(wù)端響應(yīng)請(qǐng)求
入口在SubscribeServiceRequestHandler.handle()四、服務(wù)端檢查客戶端是否存活
入口在ConnectionManager.start()
1.在這個(gè)方法中姊氓,主要是區(qū)分哪些client已經(jīng)過期丐怯,并把過期的client存放到outDatedConnection集合中。
2.服務(wù)端會(huì)對(duì)過期的client進(jìn)行一次探活操作翔横,沒有1s無響應(yīng)读跷,直接剔除該客戶端。
3.發(fā)送該事件ClientDisconnectEvent禾唁,然后執(zhí)行異步更新注冊(cè)表效览、集群數(shù)據(jù)同步。