> 文章列表 > 微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)

微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)

微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)

文章目录

  • 心跳机制与健康检查流程图
  • 心跳机制与健康检查总结
  • 详细源码说明
  • 当多个服务进行注册时,如何解决注册表并发冲突问题?

心跳机制与健康检查流程图

微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)

心跳机制与健康检查总结

  • 微服务在启动注册Nacos时,会创建一个定时任务,定时向服务端发生自己的心跳。发送到服务端后,服务端会更新此实例的心跳时间为当前时间。
  • Nacos服务端在创建注册表时,会同时创建一个定时任务,定时检查服务心跳,如果服务超过15秒没有心跳,会将它的状态设置为false,当超过30秒没有心跳时,会删除实例。
  • 删除实例时,会发送DELETE请求进行删除,删除完成后,会向客户端推送最新的注册表,如果推送失败,那么客户端也可以通过定时拉取获得最新列表。

详细源码说明

  • 服务注册时心跳任务。
    从注册方法开始看起:
    微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)
    先调用注册方法。
  public void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException {NamingUtils.checkInstanceIsLegal(instance);String groupedServiceName = NamingUtils.getGroupedName(serviceName, groupName);// 判断是否是临时实例if (instance.isEphemeral()) {// 心跳实例数据组装BeatInfo beatInfo = this.beatReactor.buildBeatInfo(groupedServiceName, instance);//  重点方法:添加一个延时心跳任务this.beatReactor.addBeatInfo(groupedServiceName, beatInfo);}this.serverProxy.registerService(groupedServiceName, groupName, instance);}

微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)
添加定时任务。
微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)
开启线程执行定时任务,通过sendBeat向服务端发送心跳。
微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)
这个地址就是发送实例心跳的地址。
微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)
然后来到服务端:
微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)
微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)

public class ClientBeatProcessor implements Runnable {}

微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)
在run方法中更新了最后的心跳时间为当前时间,并且如果实例的健康标识如果为false,此时也会更新为true,心跳更新结束。

  • 客户端健康检查
    也是从服务端注册时看起:
    微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)
    创建实例列表。
    微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)
 private void putServiceAndInit(Service service) throws NacosException {// 向注册表中新增或修改服务信息putService(service);// 初始化服务信息,添加心跳检查任务service.init();// 添加数据变化监听consistencyService.listen(KeyBuilder.buildInstanceListKey(service.getNamespaceId(), service.getName(), true), service);consistencyService.listen(KeyBuilder.buildInstanceListKey(service.getNamespaceId(), service.getName(), false), service);Loggers.SRV_LOG.info("[NEW-SERVICE] {}", service.toJson());}

微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)

public class ClientBeatCheckTask implements Runnable {}

微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)
微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)
健康检查大概就完成了。

  • 实例下线

微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)
微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)
调用删除方法。
微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)
微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)
微服务学习-SpringCloud -Nacos (心跳机制及健康检查源码学习)
然后就是监听任务进行数据推送到客户端保证注册列表的一个同步,这样就完成了服务下线。

当多个服务进行注册时,如何解决注册表并发冲突问题?

写时复制技术

  • 何为写时复制?
    写时复制,Copy-on-write,简称COW,是一种优化策略。其核心思想是,如果有多个调用者同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。
  • Nacos中如何体现?
    Nacos中不会对oldMap进行修改,而是把oldMap复制一份,读操作读oldMap,写操作写newMap,操作完成后将newMap替换会真正的注册表。
  • 优点:
    提高系统性能;
    减少并发冲突,提高系统并发能力。
    缺点:
    占用空间大;
    数据同步不及时。