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

相关推荐
xdpcxq102911 小时前
Flask - 常见应用部署方案
后端·python·flask
Ivanqhz11 小时前
数据流分析的核心格(Lattice)系统
开发语言·javascript·后端·python·算法·蓝桥杯·rust
键盘鼓手苏苏11 小时前
Flutter for OpenHarmony 实战:Flutter Rust Bridge — 极致计算性能方案
开发语言·后端·flutter·华为·rust·json·harmonyos
好家伙VCC12 小时前
# 发散创新:基于 Go 语言打造高性能服务网格的实践与突破在微服务架构
java·python·微服务·架构·golang
unirst198500712 小时前
搭建Golang gRPC环境:protoc、protoc-gen-go 和 protoc-gen-go-grpc 工具安装教程
开发语言·后端·golang
古城小栈13 小时前
Rust 中的 内存对齐
开发语言·后端·rust
我爱娃哈哈13 小时前
SpringBoot + 决策表(Decision Table)+ Excel 导入:运营人员直接配置复杂规则逻辑
后端
Cache技术分享13 小时前
324. Java Stream API - 实现 Collector 接口:自定义你的流式收集器
前端·后端
三水不滴13 小时前
SpringBoot + Redis 滑动窗口计数:打造高可靠接口防刷体系
spring boot·redis·后端
若水不如远方13 小时前
分布式一致性原理(四):工程化共识 —— Raft 算法
分布式·后端·算法