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 这样客户端的服务心跳就被服务端处理好了。
经验分享 程序员 微信小程序 职场和发展