首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 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 和属性的使用在后面再看看 , 贡献一个流程图
本文转载自: 掘金