深入理解Apollo核心机制之本地缓存——你知道Apollo把你的配置缓存到哪里了吗?
入口
ApolloApplicationContextInitializer (它实现了 ApplicationContextInitializer接口,并重写了initialize方法)。
ApplicationContextInitializer简单介绍:
ApplicationContextInitializer是Spring框架原有的东西,这个类的主要作用就是在ConfigurableApplicationContext类型(或者子类型)的ApplicationContext做refresh之前,允许我们对ConfiurableApplicationContext的实例做进一步设置和处理。ApplicationContextInitializer接口是在spring容器刷新之前执行的一个回调函数。是在ConfigurableApplicationContext#refresh之前,允许我们对ConfigurableApplicationContext的实例做进一步的设置或者处理。
ApolloApplicationContextInitializer#initialize 初始化
主要做了一些初始化工作,其中本文要关注的就是这个ConfigService.getConfig(namespace)方法
getConfig(String namespace) 加载配置
DefaultConfigManager#getConfig(String namespace) 加载配置
DefaultConfigFactory#create(String namespace) 创建Config工厂
DefaultConfigFactory#createLocalConfigRepository(String namespace) 创建本地配置文件Repository
(☆)LocalFileConfigRepository(String namespace, ConfigRepository upstream) 构造函数设置本地配置文件缓存路径
LocalFileConfigRepository#setLocalCacheDir(File baseDir, boolean syncImmediately) 设置路径
LocalFileConfigRepository#checkLocalConfigCacheDir(File baseDir) 确认路径存在
(☆)LocalFileConfigRepository#findLocalCacheDir() 拼接路径
ClassLoaderUtil
(☆)ConfigUtil#getDefaultLocalCacheDir() 获取默认路径
(☆)ConfigUtil#getCustomizedCacheRoot() 三种方式获取用户自定义配置路径
DefaultServerProvider#initialize()
总结
Apollo获取本地配置文件缓存路径的流程
- 先获取自定义的路径,有优先顺序
- 从系统属性中获取 System.getProperty("apollo.cacheDir")
- 从系统环境变量中获取 Key为“APOLLO_CACHDIR”
- 从服务配置文件中获取,根据操作系统不同,配置撰写的地址也不同。
- SERVER_PROPERTIES_LINUX = "/opt/settings/server.properties";
- SERVER_PROPERTIES_WINDOWS = "C:/opt/settings/server.properties";
- 如果从自定义方式没有获取到路径配置,则使用默认的路径前缀(根据操作系统不同,路径也不同)
"C:\opt\data" , "/opt/data“
注意:在获取完路径后,Apollo会对路径做一定的处理。
1.在路径后加上一层路径,文件夹名称为当前应用AppId;
2.在上述路径后,Apollo还会加一层文件夹,名称为"/config-cache"。
所以,无论配置的路径是什么,最后两层文件夹一定是/{appId}/config-cache。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)