1. 程式人生 > 其它 >nacos原始碼學習--健康檢查與心跳機制

nacos原始碼學習--健康檢查與心跳機制

--------------客戶端----------------------------------------

---------------NacosNamingSpaceService------------------
// @ZyxNote健康檢查與心跳
@Override
public void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException {
NamingUtils.checkInstanceIsLegal(instance);
String groupedServiceName = NamingUtils.getGroupedName(serviceName, groupName);
// @ZyxNote健康檢查與心跳 首先判斷 是不是臨時例項
if (instance.isEphemeral()) {
BeatInfo beatInfo = beatReactor.buildBeatInfo(groupedServiceName, instance);
// @ZyxNote健康檢查與心跳 註冊例項的時候 添加了一個BeatInfo 追進去
beatReactor.addBeatInfo(groupedServiceName, beatInfo);
}
serverProxy.registerService(groupedServiceName, groupName, instance);
}
--------------addBeatInfo(..)-----------------------------
public void addBeatInfo(String serviceName, BeatInfo beatInfo) {
NAMING_LOGGER.info("[BEAT] adding beat: {} to beat map.", beatInfo);
String key = buildKey(serviceName, beatInfo.getIp(), beatInfo.getPort());
BeatInfo existBeat = null;
//fix #1733
if ((existBeat = dom2Beat.remove(key)) != null) {
existBeat.setStopped(true);
}
dom2Beat.put(key, beatInfo);
// @ZyxNote健康檢查與心跳 BeatTask implements Runnable 5sec之後執行這個任務 追進去
executorService.schedule(new BeatTask(beatInfo), beatInfo.getPeriod(), TimeUnit.MILLISECONDS);
MetricsMonitor.getDom2BeatSizeMonitor().set(dom2Beat.size());
}
----------------BeatTask.run()------------------------------
先發送一個延時任務
// @ZyxNote健康檢查與心跳 點進去 執行了一個延時任務
JsonNode result = serverProxy.sendBeat(beatInfo, BeatReactor.this.lightBeatEnabled);
  -------------sendBeat(..)---------------------
// @ZyxNote健康檢查與心跳 一大堆東西封裝 呼叫了這個方法 傳送例項心跳
String result = reqApi(UtilAndComs.nacosUrlBase + "/instance/beat", params, bodyMap, HttpMethod.PUT);
------------------------------------------------
定時發心跳的方法
// @ZyxNote健康檢查與心跳 執行了一個定時任務 傳送心跳
executorService.schedule(new BeatTask(beatInfo), nextTime, TimeUnit.MILLISECONDS);
---------------------------------------------------------
  服務端的心跳定時檢查任務
  服務端註冊例項後 起一個定時監測心跳任務
public void init() {
// @ZyxNote健康檢查與心跳 此處 註冊了心跳監測定時任務
HealthCheckReactor.scheduleCheck(clientBeatCheckTask);
for (Map.Entry<String, Cluster> entry : clusterMap.entrySet()) {
entry.getValue().setService(this);
entry.getValue().init();
}
}
------------ClientBeatCheckTask.run()---------------
// @ZyxNote健康檢查與心跳 判斷服務健康演算法
if (System.currentTimeMillis() - instance.getLastBeat() > instance.getInstanceHeartBeatTimeOut()) {
            &
// @ZyxNote健康檢查與心跳 判斷服務是否存活演算法
if (System.currentTimeMillis() - instance.getLastBeat() > instance.getIpDeleteTimeout()) {
----------------------------------------------------------