概述
Nacos现在作为主流分布式微服务,可以说是使用频率非常高的分布式框架,集注册中心、配置中心为一体;相信大家对Nacos的使用已经非常熟悉,本章主要介绍Nacos的高级特性,你不太知道可能会忽视的一些知识点,就是它实现高可用必备的一些功能,本地缓存及故障转移机制;
Nacos客户端本地缓存
首先我们来看Nacos客户端Naming包下的ServiceInfoHolder类,看它的构造方法,首先看到serviceInfoMap这个线程安全的Map集合,value是一个ServiceInfo,每次客户端去请求服务端拿到服务实例,都会放到这个map里;
我们看到有三个主要步骤,分别是:
- initCacheDir初始化本地缓存
- isLoadCacheAtStart 默认为false,根据配置从本地缓存初始化服务;
- 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的本地缓存和故障转移的源码进分析,其实主要是本地缓存有时候会出现一些故障,当然这些故障就需要用到故障处理机制,将故障转移备份的目录文件下;发生故障的时候,就可以从故障备份的文件中来获取服务实例信息,继续进行调用;