当nacos进行服务注册的时候,NacosServiceRegistry.class会调用register()方法进行服务注册,该方法中调用了namingService.registerInstance()方法进行服务注册的逻辑。
NacosNamingService实现了NamingService的接口;然后在namingService.registerInstance()方法中,会做两件事情,第一件事就是组装心跳包BeatInfo,并且发送心跳:
NacosNamingService中的构造函数,会调用init()方法,然后在init方法中会执行一个BeatReactor线程
NacosNamingService中的构造函数和init()方法:
BeatReactor的构造函数中创建了一个ScheduledExecutorService线程操作对象,在里面执行了一个线程操作,BeatTask线程,然后在BeatTask线程中调用了sendBeat()方法,将心跳包作为参数;
BeatTask线程操作:调用sendBeat()方法
在sendBeat()方法中,通过http服务,调用了InstanceController.beat()方法,进行心跳的确认:
在服务端的心跳接口,InstanceController.beat内,会判断实例是否存在,如果不存在,会重新注册。(如网络不通导致实例在服务端被下线,或服务端重启临时实例丢失)
然后,执行service.processClientBeat(clientBeat)方法,调用一个线程任务
在该任务中,将上次的心跳时间,设置为当前时间
至此,nacos发送心跳的过程就到此结束。
参考1,参考2,参考3,流程图链接