Nacos高可用特性-本地缓存和故障转移机制

概述

Nacos现在作为主流分布式微服务,可以说是使用频率非常高的分布式框架,集注册中心、配置中心为一体;相信大家对Nacos的使用已经非常熟悉,本章主要介绍Nacos的高级特性,你不太知道可能会忽视的一些知识点,就是它实现高可用必备的一些功能,本地缓存及故障转移机制;

Nacos客户端本地缓存

首先我们来看Nacos客户端Naming包下的ServiceInfoHolder类,看它的构造方法,首先看到serviceInfoMap这个线程安全的Map集合,value是一个ServiceInfo,每次客户端去请求服务端拿到服务实例,都会放到这个map里;

我们看到有三个主要步骤,分别是:

  1. initCacheDir初始化本地缓存
  2. isLoadCacheAtStart 默认为false,根据配置从本地缓存初始化服务;
  3. FailoverReactor 创建FailoverReactor,这个是故障转移的一个类,后面会讲到;

ServiceInfo

processServiceInfo方法,是主要将注册中心的服务缓存到本地的一个方法;

判断注册的实例信息是否有更改,如果有更改则去/publishEvent/发布变更信息,然后调DiskCache./write/(serviceInfo, cacheDir),将实例的变更信息存入磁盘;⚠️这里存放在磁盘也是防止本地服务挂了,无法获取到本地缓存的服务实例,可以从磁盘获取;

Nacos故障转移机制

FailoverReactor

首先我们来看FailoverReactor这个类的构造方法,

  • 构造ServiceInfoHolder实例;'
  • failoverDir(故障转移的一个目录)前面ServiceInfoHolder构造方法有个initCacheDir方法,里面会拼接cacheDir目录+/failover;
  • executorService初始化,通过定时线程池执行任务;

init方法

  • 第一个任务scheduleWithFixedDelay,直接执行每个任务间隔5秒;
  • 第二个延迟30分钟执行,执行间隔周期24h
  • 第三个10秒后如何故障目录为空,则执行DiskFileWriter强制备份;

SwitchRefresher第一个定时线程任务的执行方法;

DiskFileWriter第二个定时线程任务的执行方法;

第三个上面已经说过;

FailoverFileReader

这个是故障转移读取类属于核心类,主要是读取故障转移目录,就是init方法里面拼接的这个目录/cacheDir+/failover,获取内容转换为serviceInfo,然后将serviceInfo存入map缓存中

总结

通过跟踪Nacos的本地缓存和故障转移的源码进分析,其实主要是本地缓存有时候会出现一些故障,当然这些故障就需要用到故障处理机制,将故障转移备份的目录文件下;发生故障的时候,就可以从故障备份的文件中来获取服务实例信息,继续进行调用;

相关推荐
用户40269244819085 分钟前
CRMEB Pro 优惠券领取校验:为什么同一张券会被重复领或用错场景?
后端
IManiy16 分钟前
总结之Vibe Coding:后端骨架
后端
ikoala18 分钟前
Codex 怎么买、怎么充值?先把这两套计费搞清楚
前端·javascript·后端
前端Hardy1 小时前
一个时代结束了:npm 终于对 install 脚本下手了
前端·javascript·后端
damaoyou1 小时前
Cog3DRangeImagePlaneEstimatorTool完全指南
后端
Nturmoils1 小时前
分页别写太顺手,LIMIT 背后还有排序和边界
数据库·后端
神奇小汤圆1 小时前
国产版“Codex”初体验,智谱ZCode很强啊!
后端
站大爷IP1 小时前
Python里的“赋值”到底是什么意思?
后端
鹅城剑仙2 小时前
Spring Boot 微服务架构设计与最佳实践
spring boot·后端·微服务
Wyc724092 小时前
Seata
spring cloud