nacos(三)⼼跳检测原理
这篇⽂章主要针对nacos客户端的⼼跳检测。
1.在上⼀篇⽂章已提到注册服务的时候,碰到临时节点需要注册⼼跳检测
@Override
publicvoidregisterInstance(StringrviceName,StringgroupName,Instanceinstance)throwsNacosException{
if(meral()){//临时节点,配置⼼跳检测
BeatInfobeatInfo=newBeatInfo();
viceName(upedName(rviceName,groupName));
(());
t(t());
ster(sterName());
ght(ght());
adata(adata());
eduled(fal);
//配置⼼跳检测间隔,默认5秒
longinstanceInterval=tanceHeartBeatInterval();
iod(instanceInterval==0?DEFAULT_HEART_BEAT_INTERVAL:instanceInterval);
tInfo(upedName(rviceName,groupName),beatInfo);
}
erService(upedName(rviceName,groupName),groupName,instance);
}
2.⼼跳检测间隔是可以改变的,我们可以进⼊tanceHeartBeatInterval()⽅法看看nacos是如何获取的
publiclonggetInstanceHeartBeatInterval(){
//通过⽅法名都可以明⽩意思:根据key去获取检测间隔,如果没有,则选择默认值
returngetMetaDataByKeyWithDefault(_BEAT_INTERVAL,T_HEART_BEAT_INTERVAL);
}
//key名称
publicstaticfinalStringHEART_BEAT_INTERVAL="al";
//默认值5秒
publicstaticfinallongDEFAULT_HEART_BEAT_INTERVAL=is(5);
3.根据HEART_BEAT_INTERVAL常量,我们去设置⾃⼰想要的间隔时间
cloud:
nacos:
discovery:
rver-addr:localhost:8848
heart-beat-interval:10
4.我们继续往下⾛,进⼊tInfo()⽅法,发现⼼跳检测主要是创建了⼀个定时任务,我们看⼀下BeatTask⾥⾯做了什么
publicvoidaddBeatInfo(StringrviceName,BeatInfobeatInfo){
NAMING_("[BEAT]addingbeat:{}tobeatmap.",beatInfo);
Stringkey=buildKey(rviceName,(),t());
BeatInfoexistBeat=null;
//fix#1733
if((existBeat=(key))!=null){
pped(true);
}
//dom2Beat是⼀个concurrenthashmap,当nacos服务关闭时,会⽤到它来销毁定时任务
(key,beatInfo);
le(newBeatTask(beatInfo),iod(),ECONDS);
2BeatSizeMonitor().t(());
}
5.发现BeatTask实现runnable接⼝,at发送⼼跳,发送完后,再创建⼀个定时任务,这个⼼跳检测就能⼀直不间
断进⾏下去,直到nacos服务销毁
classBeatTaskimplementsRunnable{
BeatInfobeatInfo;
publicBeatTask(BeatInfobeatInfo){
fo=beatInfo;
}
@Override
publicvoidrun(){
if(ped()){
return;
}
longresult=at(beatInfo);
longnextTime=result>0?result:iod();
le(newBeatTask(beatInfo),nextTime,ECONDS);
}
}
at(beatInfo)主要是调⽤nacos服务端的API,⾄此⼼跳检测客服端流程⾛完。
publiclongndBeat(BeatInfobeatInfo){
try{
if(NAMING_gEnabled()){
NAMING_("[BEAT]{}ndingbeattorver:{}",namespaceId,ng());
}
Map
("beat",String(beatInfo));
(ACE_ID,namespaceId);
(E_NAME,viceName());
Stringresult=reqAPI(_URL_BASE+"/instance/beat",params,);
JSONObjectjsonObject=bject(result);
if(jsonObject!=null){
g("clientBeatInterval");
}
}catch(Exceptione){
NAMING_("[CLIENT-BEAT]failedtondbeat:"+String(beatInfo),e);
}
return0L;
}
本文发布于:2022-12-28 12:57:28,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/46765.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |