Nacos 1.4.1注册中心源码深度解析-服务心跳
客户端
客户端在服务注册的时候,会进到com.alibaba.nacos.client.naming.NacosNamingService#registerInstance(java.lang.String, java.lang.String, com.alibaba.nacos.api.naming.pojo.Instance)
如果是临时实例,在这个方法里会调用beatReactor.addBeatInfo。这个方法里会创建一个Task去进行心跳发送。
executorService.schedule(new BeatTask(beatInfo), beatInfo.getPeriod(), TimeUnit.MILLISECONDS);
Period
beatInfo.getPeriod() 默认是5s,设置Period的代码在registerInstance方法中,调用链如下:
com.alibaba.nacos.client.naming.NacosNamingService#registerInstance(java.lang.String, java.lang.String, com.alibaba.nacos.api.naming.pojo.Instance)
--> beatReactor.buildBeatInfo
--> beatInfo.setPeriod(instance.getInstanceHeartBeatInterval()); --> getInstanceHeartBeatInterval
--> Constants.DEFAULT_HEART_BEAT_INTERVAL
DEFAULT_HEART_BEAT_INTERVAL = TimeUnit.SECONDS.toMillis(5);
BeatTask
BeatTask的run方法中会sendBeat
最终调用到下面的代码
reqApi(UtilAndComs.nacosUrlBase + "/instance/beat", params, bodyMap, HttpMethod.PUT);
在run方法的最后会递归的添加BeatTask任务,每隔5s发送一次心跳。
executorService.schedule(new BeatTask(beatInfo), nextTime, TimeUnit.MILLISECONDS);
服务端
服务端的入口在com.alibaba.nacos.naming.controllers.InstanceController#beat
核心方法是service.processClientBeat,添加了一个ClientBeatProcessor的任务。我们再来看下这个任务。
com.alibaba.nacos.naming.healthcheck.ClientBeatProcessor#run
在这个任务里核心是更新心跳时间,并把实例的健康状态更新为true
这样客户端的服务心跳就被服务端处理好了。
客户端 客户端在服务注册的时候,会进到com.alibaba.nacos.client.naming.NacosNamingService#registerInstance(java.lang.String, java.lang.String, com.alibaba.nacos.api.naming.pojo.Instance) 如果是临时实例,在这个方法里会调用beatReactor.addBeatInfo。这个方法里会创建一个Task去进行心跳发送。 executorService.schedule(new BeatTask(beatInfo), beatInfo.getPeriod(), TimeUnit.MILLISECONDS); Period beatInfo.getPeriod() 默认是5s,设置Period的代码在registerInstance方法中,调用链如下: com.alibaba.nacos.client.naming.NacosNamingService#registerInstance(java.lang.String, java.lang.String, com.alibaba.nacos.api.naming.pojo.Instance) --> beatReactor.buildBeatInfo --> beatInfo.setPeriod(instance.getInstanceHeartBeatInterval()); --> getInstanceHeartBeatInterval --> Constants.DEFAULT_HEART_BEAT_INTERVAL DEFAULT_HEART_BEAT_INTERVAL = TimeUnit.SECONDS.toMillis(5); BeatTask BeatTask的run方法中会sendBeat 最终调用到下面的代码 reqApi(UtilAndComs.nacosUrlBase + "/instance/beat", params, bodyMap, HttpMethod.PUT); 在run方法的最后会递归的添加BeatTask任务,每隔5s发送一次心跳。 executorService.schedule(new BeatTask(beatInfo), nextTime, TimeUnit.MILLISECONDS); 服务端 服务端的入口在com.alibaba.nacos.naming.controllers.InstanceController#beat 核心方法是service.processClientBeat,添加了一个ClientBeatProcessor的任务。我们再来看下这个任务。 com.alibaba.nacos.naming.healthcheck.ClientBeatProcessor#run 在这个任务里核心是更新心跳时间,并把实例的健康状态更新为true 这样客户端的服务心跳就被服务端处理好了。