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

相关推荐
Data_Adventure12 分钟前
TypeScript 开发者转向 Java:学习重点与思维迁移指南
后端
吴祖贤17 分钟前
Spring AI 零基础入门:从踩坑到上手的完整指南
后端
小二·18 分钟前
从零到上线:Spring Boot 3 + Spring Cloud Alibaba + Vue 3 构建高可用 RBAC 微服务系统(超详细实战)
vue.js·spring boot·微服务
cherry523022 分钟前
Java大厂面试真题:Spring Boot + 微服务 + 缓存架构三轮技术拷问实录
jvm·spring boot·mysql·微服务·java面试·分布式架构·redis缓存
code_std28 分钟前
SpringBoot 登录验证码
java·spring boot·后端
Mos_x36 分钟前
@RestController注解
java·后端
bcbnb1 小时前
Fiddler抓包工具使用教程,HTTPHTTPS抓包、代理配置与调试技巧全解析(附实战经验)
后端
三口吃掉你1 小时前
微服务之网关(Spring Cloud Gateway)
java·网关·微服务·gateway
虎子_layor1 小时前
PostgreSQL这么多优势,为什么还要使用MySQL
后端·sql