摘要: 原创出处 http://www.iocoder.cn/Apollo/client-config-api-3/ 「芋道源码」欢迎转载,保留摘要,谢谢!
������关注微信公众号:【芋道源码】有福利:
1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
4. 新的源码解析文章实时收到通知。每周更新一篇左右。
> 5. 认真的源码交流微信群。
1. 概述
老艿艿:本系列假定胖友已经阅读过 《Apollo 官方 wiki 文档》 ,特别是 《Java 客户端使用指南》 。
本文接 《Apollo 源码解析 —— 客户端 API 配置(二)之一览》 一文,分享 ConfigFile 接口,及其子类,如下图:
从实现上,ConfigFile 和 Config 超级类似,所以本文会写的比较简洁。
- Config 基于 KV 数据结构。
- ConfigFile 基于 String 数据结构。
2. ConfigFile
在 《Apollo 源码解析 —— 客户端 API 配置(一)之一览》 的 「3.2 ConfigFile」 中,有详细分享。
3. AbstractConfigFile
com.ctrip.framework.apollo.internals.AbstractConfigFile
,实现 ConfigFile、RepositoryChangeListener 接口,ConfigFile 抽象类,实现了 1)异步通知监听器、2)计算属性变化等等特性,是 AbstractConfig + DefaultConfig 的功能子集。
3.1 构造方法
private static final Logger logger = LoggerFactory.getLogger(AbstractConfigFile.class);
/**
* ExecutorService 对象,用于配置变化时,异步通知 ConfigChangeListener 监听器们
*
* 静态属性,所有 Config 共享该线程池。
*/
private static ExecutorService m_executorService;
/**
* Namespace 的名字
*/
protected String m_namespace;
/**
* ConfigChangeListener 集合
*/
private List m_listeners = Lists.newCopyOnWriteArrayList();
protected ConfigRepository m_configRepository;
/**
* 配置 Properties 的缓存引用
*/
protected AtomicReference m_configProperties;
static {
m_executorService = Executors.newCachedThreadPool(ApolloThreadFactory.create("ConfigFile", true));
}