SpringCloud 配置中心服务端配置解析流程分析

点击上方蓝色“架构荟萃”关注我们,输入1024,你懂的

环境准备

  1. 启动 Eureka

  2. 启动 ConfigServer

  3. 启动 aiportal-wsm-service 微服务

  4. Gitlab 配置文件:aiportal-wsm-service、globa、,dbconfig 等yml文件

配置解析入口

在启动 aiportal-wsm-service 微服务程序时,我们可以从 console 输出日志定位出 ConfigServicePropertySourceLocator 类调用了配置中心接口地址:http://localhost:8888。

接着 ConfigServicePropertySourceLocator  输出 bootstrap.yml 配置的配置中心地址属性,其目的是从配置中心拉去 dev 分支下的 aiportal-wsm-service 、global、dbconfig 等相关配置文件。

配置中心地址说明

  • name  配置文件名称,如果需要同时加载多个配置文件,需要用逗号隔开,如:aiportal-wsm-service(微服务启动配置文件)、global(全局参数配置)、dbconfig(数据库配置)

  • profile 部署环境,如dev、test、prod

  • uri 配置中心地址,如:http://localhost:8888

最后,如果从配置中心拉取配置文件成功,会输出如下日志:

b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource [name='configService', propertySources=[MapPropertySource [name='http://10.236.0.96/unicom-portal/portal-repo.git/dbconfig/dbconfig-dev.yml'], MapPropertySource [name='http://10.236.0.96/unicom-portal/portal-repo.git/global/global-dev.yml'], MapPropertySource [name='http://10.236.0.96/unicom-portal/portal-repo.git/aiportal-wsm-service/aiportal-wsm-service-dev.yml']]]

这时配置入口类 PropertySourceBootstrapConfiguration  就是我们要找的解析配置文件入口类,所以研究 SpringBoot 程序如何加载配置文件,PropertySourceBootstrapConfiguration 是程序 debug 的关键。

PropertySourceBootstrapConfiguration

利用 IDEA 查看 PropertySourceBootstrapConfiguration 继承和实现的类图

首先, PropertySourceBootstrapConfiguration 通过注解 @Configuration 表明类本身是一个配置类,通过

@EnableConfigurationProperties(PropertySourceBootstrapProperties.class) 注解表明只有开启配置属性解析开关,PropertySourceBootstrapConfiguration 才会正常解析配置属性。

其次,PropertySourceBootstrapConfiguration 实现 ApplicationContextInitializer 接口类,其作用是在程序启动时,调用initialize方法进行相关初始化工作,也就是接下来要讲的 ConfigServer 的客户端解析配置文件的核心流程。

配置中心解析流程

通过 debug 调试 PropertySourceBootstrapConfiguration 的 initialize 方法,通过Debugger 的 Variables 属性窗口

发现 this.propertySourceLocators 这个成员集合属性,里面保存了配置属性解析器:ConfigServicePropertySourceLocator,而这个类是 Configserver 客户端配置属性解析器,其 Java 类目录在

org.springframework.cloud.config.client 文件夹下,而ConfigServicePropertySourceLocator 解析器存在目的是从配置中心拉取 SpringBoot程序的配置文件,用于程序初始化数据库连接池、业务参数配置等。

通过遍历 this.propertySourceLocators 集合(默认只有一个   ConfigServicePropertySourceLocator 解析器,出于业务目的,也可以自定义多个配置属性截器),属性解析器子项 ConfigServicePropertySourceLocator 会调用 locate  方法,此方法是从配置中心拉取配置文件真正执行者。

locate方法执行流程如下:

获取 bootstrap 的配置中心地址参数:ConfigClientProperties

初始化 http 请求模板 RestTemplate,其中 username 为默认用户:user,密码为空

关键配置文件拉取代码,调用 getRemoteEnvironment 方法返回一个 Environment对象:



Environment result = getRemoteEnvironment(restTemplate, properties, label.trim(), state);

通过 debug 调试信息,发现成功拉取到 dbconfig-dev.yml、global-dev.yml、aiportal-wsm-service.yml 等配置文件,其中每个配置文件的属性都存放在一个PropertySource 类的 source 成员属性中,

dbconfig-dev.yml配置属性值如下:

global-dev.yml配置属性值如下:

iportal-wsm-service.yml 配置属性值如下:

在线配置中心查看

如果想在线查看某个服务的配置属性,比如 aiportal-wsm-service 微服务配置属性,在浏览器输入http://localhost:8888/aiportal-wsm-service/dev

总结

使用 ConfigServer 作为服务的配置中心需要依赖第三方配置仓库,如 Gitlab、Svn等;并且 ConfigServer  没有可视化的控制台,能够针对不同的配置文件进行在线修改并能够及时刷新应用的配置。所以一旦涉及配置文件需要修改将是一件非常麻烦的事情。

而市面上如阿里的 Nacos 、携程的 Appllo 等配置中心很好的解决这个问题,像 Nacos 可以持久化配置,并且完整的保留历史的修订版本,能够实现上个版本的恢复操作,非常的友好。所以现在针对 SpringCloud 的生态中,有些组件是可以替换的,例如:

  1. Nacos(注册中心&配置中心) 对标 Eureka、ConfigServer

  2. Consul 对标 ConfigServer

如果您觉得本文对你有帮助,欢迎老铁们帮忙点赞、在看、留言、分享你们的支持是我原创最大的动力

往期精选

利用 Sharding-JDBC 解决数据库读写分离后,数据查询延时问题

基于分布式文件系统 FastDFS,利用 Zuul 网关实现滑块验证登录

月薪8K,java初级程序员需要掌握的一些面试经验

jsp的10年是谁让它如此落幕?

 

福利彩蛋

最近整理一份很全的Java学习资料,感兴趣的老铁可以在微信搜索【架构荟萃】,后台回复以下关键字,即可免费获取。

回复“sb”,免费获取 SpringBoot 全套视频教程。

回复“sc”,免费获取 SpringCloud 全套视频教程。

回复“面试”,免费获取 Java 面试全套题集。

回复“小程序”,免费获取微信小程序开发 全套视频教程。

 

扫描上图微信二维码(加V:WooolaDuang)进微信群

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬禹随笔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值