文章目录
- 心跳机制与健康检查流程图
- 心跳机制与健康检查总结
- 详细源码说明
- 当多个服务进行注册时,如何解决注册表并发冲突问题?
心跳机制与健康检查流程图
心跳机制与健康检查总结
- 微服务在启动注册Nacos时,会创建一个定时任务,定时向服务端发生自己的心跳。发送到服务端后,服务端会更新此实例的心跳时间为当前时间。
- Nacos服务端在创建注册表时,会同时创建一个定时任务,定时检查服务心跳,如果服务超过15秒没有心跳,会将它的状态设置为false,当超过30秒没有心跳时,会删除实例。
- 删除实例时,会发送DELETE请求进行删除,删除完成后,会向客户端推送最新的注册表,如果推送失败,那么客户端也可以通过定时拉取获得最新列表。
详细源码说明
- 服务注册时心跳任务。
从注册方法开始看起:
先调用注册方法。
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);
}
添加定时任务。
开启线程执行定时任务,通过sendBeat向服务端发送心跳。
这个地址就是发送实例心跳的地址。
然后来到服务端:
public class ClientBeatProcessor implements Runnable {}
在run方法中更新了最后的心跳时间为当前时间,并且如果实例的健康标识如果为false,此时也会更新为true,心跳更新结束。
- 客户端健康检查
也是从服务端注册时看起:
创建实例列表。
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());
}
public class ClientBeatCheckTask implements Runnable {}
健康检查大概就完成了。
- 实例下线
调用删除方法。
然后就是监听任务进行数据推送到客户端保证注册列表的一个同步,这样就完成了服务下线。
当多个服务进行注册时,如何解决注册表并发冲突问题?
写时复制技术
- 何为写时复制?
写时复制,Copy-on-write,简称COW,是一种优化策略。其核心思想是,如果有多个调用者同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本(private copy)给该调用者,而其他调用者所见到的最初的资源仍然保持不变。 - Nacos中如何体现?
Nacos中不会对oldMap进行修改,而是把oldMap复制一份,读操作读oldMap,写操作写newMap,操作完成后将newMap替换会真正的注册表。 - 优点:
提高系统性能;
减少并发冲突,提高系统并发能力。
缺点:
占用空间大;
数据同步不及时。