这是我参与更文挑战的第9天,活动详情查看: 更文挑战
总文档 :文章目录
Github : github.com/black-ant
一 .前言
这是 Seata 部分的第二篇 , 主要来说一说 Seata Server 中如何完成配置的处理 , Seata 的启动可以参考 Seata 的启动流程 , 本篇文档主要包含如下内容 :
- 配置的扫描
- 配置的加载
- 配置的动态加载(下一篇)
二 . 配置的扫描
上一篇我们知道 , 配置主要有2个 , nacos.conf / registry.conf , 这2个文件主要由ConfigurationFactory 加载完成
配置处理的起点 :
先来看一下配置的起点 , 在前面说了 , 在处理 main 的时候 , 处理过 ParameterParser ,一切都是从那里开始 :
- Step 1 : Server # main 函数中 , 发起过 ParameterParser
- Step 2 : ParameterParser # init , 发起 ConfigurationFactory 的构建 ,同时传入 Mode 类型
1 | java复制代码private void init(String[] args) { |
PS : 在读取网络配置之前 , 会优先从本地配置中获取连接信息
配置的读取类 :
配置这里使用 AbstractConfiguration 进行配置的读取 , 此处有以下几种配置类 :
- FileConfiguration
- SpringCloudConfiguration
- ApolloConfiguration
- NacosConfiguration
- ConsulConfiguration
- EtcdConfiguration
- ZookeeperConfiguration
2.1 配置的扫描流程
registry.conf 的读取主要是由 ConfigurationFactory 完成 , 来看一下主要的逻辑 :
2.1.1 : 配置类的初始化
在获取 ConfigurationFactory 实例的时候, 会触发一个静态代码块 , 调用 ConfigurationFactory # load , 主要分为 5 个流程 :
- Step 1 : 依次获取配置类名称
- Step 2 : 如果未设置特色配置 , 此处会获得名称 -> registry
- Step 3 : envValue 可以看成 Spring 中的 Profile , 会获得特定环境的配置
- Step 4 : 通过获取的参数 , 构建 Configuration 对象
1 | java复制代码 |
2.2.2 : FileConfiguration 的构建
1 | java复制代码 |
Step 1 : getConfigFile 的获取流程
1 | java复制代码private File getConfigFile(String name) { |
Step 2 : FileConfigFactory.load(file, name) 加载流程
1 | java复制代码public static FileConfig load(File targetFile, String name) { |
Step 3 : 通过 EnhancedServiceLoader 进行加载
1 | java复制代码private static FileConfig loadService(String name, Class[] argsType, Object[] args) { |
Step 4 : EnhancedServiceLoader # load 流程
1 | java复制代码 private S loadExtension(String activateName, ClassLoader loader, Class[] argTypes, |
PS222001 : FileConfig 对象详情
该对象为一个接口 , 包括2个实现类 YamlFileConfig , SimpleFileConfig , 看下图可以知道 ,除了Nacos 配置 , 还有 Java 等等很多其他的配置
2.2.3 : 配置的加载
当成进行了 ConfigurationFactory.getInstance() 初始化后 , 会执行 getConfig 获取参数 , 最终调用 getLatestConfig :
1 | java复制代码 |
ConfigOperateRunnable 的处理
1 | java复制代码public void run() { |
三 . 配置的加载
在上一个步骤中 , 是对 ConfigurationFactory 的创建 , 在创建过程中 , 对配置文件进行了扫描处理 , 后面会通过 buildConfiguration 来 创建 Configuration 对象 :
3.1 配置的加载入口
1 | java复制代码// 此处以 Nacos 配置为例 : |
知识点一 : ConfigurationProvider
3.2 NacosConfiguration 配置
我们以一个 NacosConfiguration 来看整个的处理 , 其实都是类型的 :
1 | java复制代码// NacosConfiguration 成员变量 |
Step 1 : NacosFactory.createConfigService(getConfigProperties()); -> PS:32001
这里 getConfigProperties() 会获得一个 Properties 对象 ,其中为 Nacos 的配置属性 , 主要流程如下 :
1 | java复制代码private static Properties getConfigProperties() { |
PS: 此处并不是从 Nacos 获取配置!
Step 2 : initSeataConfig 运行
1 | java复制代码 |
附加一 : NacosConfigService
该类是 com.alibaba.nacos.client.config 的工具类 , 后续我们来分析配置的动态处理
3.3 ConfigurationCache
此处有点意思 , 还能这么缓存 ,通过把 get 方法代理 ,实现了配置的缓存操作
1 | java复制代码private static final ConcurrentHashMap<String, ObjectWrapper> CONFIG_CACHE = new ConcurrentHashMap<>(); |
总结
这篇文章相对上篇 , 稍稍深入了一下.
附录
查找资料的时候 ,发现了一个非常好的图片 , 在完善这篇文章的时候 , 拜读了很久 , 强烈建议大家看一下原文档 , 说的比我清楚多了 @ booogu.top/2021/02/28/…
PS : 脑子说我也画的出来 , 手说你会画个P
本文转载自: 掘金