环境准备




微服务databaseIdProvider 配置在哪儿 微服务config_客户端连接idea


  • Gitlab配置文件:aiportal-wsm-service,global,dbconfig等yml文件


微服务databaseIdProvider 配置在哪儿 微服务config_配置文件_02


  • 启动Eureka
  • 启动ConfigServer

解析入口

在启动Springboot程序时,在console控制台输出日志,会看到ConfigServicePropertySourceLocator类调用了配置中心接口地址:http://localhost:8888。


微服务databaseIdProvider 配置在哪儿 微服务config_配置文件_03


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


微服务databaseIdProvider 配置在哪儿 微服务config_客户端连接idea_04


配置中心地址属性说明

  • name :配置文件名称,如果需要同时加载多个配置文件,用逗号隔开,如:aiportal-wsm-service,global,dbconfig
  • profile:git分支名称,如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继承和实现类图


微服务databaseIdProvider 配置在哪儿 微服务config_微服务_05


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

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

其次、PropertySourceBootstrapConfiguration实现ApplicationContextInitializer接口类,其作用是在程序启动时,调用initialize方法进行相关初始化工作。


微服务databaseIdProvider 配置在哪儿 微服务config_微服务_06


配置中心配置属性解析流程

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


微服务databaseIdProvider 配置在哪儿 微服务config_配置文件_07


发现this.propertySourceLocators这个成员集合属性,里面保存了配置属性解析器:ConfigServicePropertySourceLocator,而这个类是Configserver客户端配置属性解析器,其Java类目录在org.springframework.cloud.config.client文件夹下,而ConfigServicePropertySourceLocator解析器存在目的是从配置中心拉取SpringBoot程序的配置文件,用于程序初始化数据库连接池、业务参数配置等。


微服务databaseIdProvider 配置在哪儿 微服务config_bc_08


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

locate方法执行流程如下:

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


微服务databaseIdProvider 配置在哪儿 微服务config_配置文件_09


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


微服务databaseIdProvider 配置在哪儿 微服务config_配置文件_10


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

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

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


微服务databaseIdProvider 配置在哪儿 微服务config_微服务_11


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


微服务databaseIdProvider 配置在哪儿 微服务config_bc_12


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


微服务databaseIdProvider 配置在哪儿 微服务config_客户端连接idea_13


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


微服务databaseIdProvider 配置在哪儿 微服务config_配置文件_14


最后每个PropertySource的配置属性都会存放到ConfigurableEnvironment配置环境类中,当有程序要读取某个配置属性值时,可以通过getProperty(key)直接获取,伪代码如下:

//定义bootstrap配置属性容器CompositePropertySource composite = new CompositePropertySource( BOOTSTRAP_PROPERTY_SOURCE_NAME);//获取系统环境配置类ConfigurableEnvironment environment = applicationContext.getEnvironment();//拉取配置中心的微服务所有配置属性PropertySource> source = locator.locate(environment)composite.addPropertySource(source);//获取系统配置属性容器MutablePropertySources propertySources = environment.getPropertySources();//保存微服务所有配置属性到系统配置属性容器中insertPropertySources(propertySources, composite);

文章分析到此,我们大致明白微服务是如何从配置中心拉取配置文件,同时把配置属性加载到系统环境配置类中,供微服务初始化程序的(如初始化数据库连接池)。


微服务databaseIdProvider 配置在哪儿 微服务config_配置文件_15


总结

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


微服务databaseIdProvider 配置在哪儿 微服务config_微服务_16