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

相关推荐
码农派大星。20 分钟前
Spring Boot 配置文件
java·spring boot·后端
杜杜的man1 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*1 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
llllinuuu1 小时前
Go语言结构体、方法与接口
开发语言·后端·golang
cookies_s_s1 小时前
Golang--协程和管道
开发语言·后端·golang
为什么这亚子1 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
想进大厂的小王1 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构
九卷技术录2 小时前
(微服务)服务治理:几种开源限流算法库/应用软件介绍和使用
微服务·服务治理·限流算法
customer082 小时前
【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源·intellij-idea