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

相关推荐
BD_Marathon9 分钟前
SpringBoot程序快速启动
java·spring boot·后端
行百里er27 分钟前
代码跑得慢?让Spring的StopWatch告诉你真相!
java·后端·github
a程序小傲1 小时前
得物Java面试被问:方法句柄(MethodHandle)与反射的性能对比和底层区别
java·开发语言·spring boot·后端·python·面试·职场和发展
IT_陈寒1 小时前
Java并发编程实战:从入门到精通的5个关键技巧,让我薪资涨了40%
前端·人工智能·后端
TaiKuLaHa1 小时前
Spring 循环依赖
java·后端·spring
程序员爱钓鱼1 小时前
Node.js 编程实战:测试与调试 —— 调试技巧与性能分析
前端·后端·node.js
小杨同学492 小时前
C 语言贪心算法实战:解决经典活动选择问题
后端
+VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue物流配送中心信息化管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·小程序·课程设计
qq_12498707532 小时前
基于微信小程序的宠物交易平台的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·微信小程序·小程序·毕业设计·计算机毕业设计
禹曦a2 小时前
Java实战:Spring Boot 构建电商订单管理系统RESTful API
java·开发语言·spring boot·后端·restful