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

2020-09-10 15:17:13 浏览数 (1)

环境准备

  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

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

代码语言:javascript复制
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对象:

代码语言:javascript复制

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

0 人点赞