首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca…
一 . 前言
作为开源框架 , springConfig 有很多功能是不适合业务场景的 , 所以我们需要通过定制重写来达到自己的业务需求的 , 这一篇就来看看 , 如果定制 SpringCloud Config 模块
二. 原理分析
2.1 处理入口
SpringCloudConfig 的入口是 EnvironmentController , 当我们输入以下地址时 , 会进行对应的处理 :
1 | java复制代码/{application}/{profile}[/{label}] |
对应处理接口 -> EnvironmentController
1 | java复制代码// 以上方式分别对应如下接口 : |
主入口逻辑 : getEnvironment
1 | java复制代码public Environment getEnvironment(String name, String profiles, String label, boolean includeOrigin) { |
2.2 处理逻辑
处理逻辑主要在 EnvironmentEncryptorEnvironmentRepository 中进行 , 这也是我们的核心定制类
这里先来看一下整体的查询体系 :
2.2.1 delegate 查找配置
注意 ,此处的delegate是可以通过自动装配改写的 ,这也意味着我们可以去实现不同的配置方式!
1 | java复制代码// C- |
2.2.2 Git 处理流程
对应 Git 查询使用的是 MultipleJGitEnvironmentRepository , 当然还有几个其他的 , 这里先不深入 :
PS : 此处依次调用了多个 Repository , 最终是调用父类 AbstractScmEnvironmentRepository 获取 Locations
1 | java复制代码//C- AbstractScmEnvironmentRepository |
2.3 Git 文件的下载
Git 文件的下载其实不麻烦 , 其主要也是使用工具类 , 以下有相关的使用 : Git Plugin
1 | java复制代码 <dependency> |
在 JGitEnvironmentRepository # getLocation 环节中 , 存在一个 refresh 操作
2.3.1 refresh git 主流程
1 | java复制代码public String refresh(String label) { |
2.3.2 拉取 Git 文件
1 | java复制代码 |
到了这里已经在本地下载到了本地 , 后面就是读取了
2.2.3 NativeEnvironmentRepository 的处理
在上文获取完 Location 后 , 会继续进行 delegate.findOne 进行链式调用 , 这里会进行如下调用 :
- C- NativeEnvironmentRepository # findOne
- C- ConfigDataEnvironmentPostProcessor # applyTo : 调用 EnvironmentPostProcessor 进行处理
- C- ConfigDataEnvironmentPostProcessor # postProcessEnvironment
- C- ConfigDataEnvironmentPostProcessor # getConfigDataEnvironment : 构建 ConfigDataEnvironment
1 | java复制代码ConfigDataEnvironment getConfigDataEnvironment(ConfigurableEnvironment environment, ResourceLoader resourceLoader, |
2.4 文件的扫描
Git 获取数据分为2步 :
- Step 1 : 从远程拉取配置到本地
- Step 2 : 从本地读取配置
2.4.1 扫描主流程
1 | java复制代码// C- ConfigDataEnvironmentContributors |
2.4.2 resolve 解析路径
1 | java复制代码// C- ConfigDataImporter # resolveAndLoad : 在这个方法中主要分为核心的三个步骤 |
resolved 的过程也有点绕 ,推荐看图 , 这里列出主要逻辑 :
Step 2-1 : resolved 循环 location
1 | java复制代码private List<ConfigDataResolutionResult> resolve(ConfigDataLocationResolverContext locationResolverContext, |
Step 2-2 : 循环其他 resolve
这里是对多种格式的资源解析处理
1 | java复制代码List<ConfigDataResolutionResult> resolve(ConfigDataLocationResolverContext context, ConfigDataLocation location, |
Step 2-3 : getReference 后 循环所有资源
1 | java复制代码// C- StandardConfigDataLocationResolver |
Step 2-4 : 循环所有的 ConfigDataResource
1 | java复制代码private List<ConfigDataResolutionResult> resolve(ConfigDataLocation location, boolean profileSpecific, |
2.5 load 加载流程
2.5.1 load 主流程
1 | java复制代码// C- ConfigDataImporter |
!!!!!! 我这里被坑的很惨 , 一个简单的案例怎么都加载不出来 , 有兴趣的可以看我下面的图猜一下为什么,很重要的一点!!!
2.5.2 loaders 加载
此处的家长对象主要为 ConfigDataLoaders , 最终调用对象为 StandardConfigDataLoader
1 | java复制代码public ConfigData load(ConfigDataLoaderContext context, StandardConfigDataResource resource) |
最终加载出来的 PropertySources
到了这里属性就正式被加载完成
总结
这一篇已经写的很长了 , 单纯点好 , 所以 Native 和属性的使用在后面再看看 , 贡献一个流程图
本文转载自: 掘金