Spring Cloud之Config配置中心之配置中心配置加载原理分析

SpringCloud总体介绍

Config使用
Config本地配置文件加载原理分析
Config配置中心配置加载原理分析

本文主要内容:

  1. 了解bootstrap Content如何读取bootstrap.properties配置文件
  2. 了解bootstrap Content如何读取Config Service配置中心的参数信息
  3. Config Service配置中心如何响应客户端的请求

在<Config本地配置文件加载原理分析 >中分析到:当我们集成了SpringCloud组件到项目中,SpringBoot启动时,会通过BootstrapApplicationListener初始化了一个名为bootstrap的容器作为parent context,并对该容器做出以下设置

  1. 指定加载的配置文件为:bootstrap.properties/yaml
  2. 创建一个名字bootstrap的PropertySource,并将它设置在所有PropertySources的第一位
  3. 设置List
  4. 启动bootstrap context容器

下面是bootstrap context容器的创建,以及启动后加载本地配置文件和配置中心配置的简易流程图,可以对照着看源码分析
在这里插入图片描述

一、客户端读取本地配置

1.1、通过ConfigFileApplicationListener加载本地配置文件

  ConfigFileApplicationListener会读取我们指定的配置文件bootstrap.properties,具体实现请自行看源码

1.ConfigFileApplicationListener默认是读取的配置文件application.properties/yaml

2.BootstrapApplicationListener在创建bootstrap context时,将配置文件名称指定为bootstrap,所以此时的ConfigFileApplicationListener会读取配置文件bootstrap.properties/yaml

1.2、BootstrapApplicationListener会跳过执行

  bootstrap context中也会存在一个BootstrapApplicationListener,但是因为PropertySources中已经存在了bootstrap,所以会直接返回,不执行后续逻辑

二、客户端读取Config Service配置中心里的参数

2.1、ApplicationContextInitializer的调用

  SpringApplication.run()方法在刷新容器之前,会先执行prepareContext()方法:逐一调用所有ApplicationContextInitializer实现类的initialize()方法

方法调用链如下:

  • SpringApplication.run()
  • ->prepareContext()
  • ->applyInitializers()
  • ->ApplicationContextInitializer.initialize()

SpringApplication.applyInitializers()方法源码:

protected void applyInitializers(ConfigurableApplicationContext context) {
   
    for (ApplicationContextInitializer initializer : getInitializers()) {
   
        Class<?> requiredType = GenericTypeResolver.resolveTypeArgument(initializer.getClass(),
                                                                        ApplicationContextInitializer.class);
        Assert.isInstanceOf(requiredType, context, "Unable to call initializer.");
        initializer.initialize(context);
    }
}

在ApplicationContextInitializer所有实现类中,有一个Spring Cloud定义的实现类:PropertySourceBootstrapConfiguration

2.2、PropertySourceBootstrapConfiguration源码分析

2.2.1、PropertySourceBootstrapConfiguration.initialize()方法分析

PropertySourceBootstrapConfiguration通过PropertySourceLocator的实现类,完成配置加载

  1. 逐一调用:List< PropertySourceLocator>的locateCollection()方法
  2. 保存PropertySourceLocator读取到的PropertySource

PropertySourceBootstrapConfiguration.initialize()方法源码

@Override
	public void initialize(ConfigurableApplicationContext applicationContext) {
   
		List<PropertySource<?>> composite = new ArrayList<>();
		AnnotationAwareOrderComparator.sort(this.propertySourceLocators);
		boolean empty = true;
		ConfigurableEnvironment environment = applicationContext.getEnvironment();
        // 循环调用PropertySourceLocator.locateCollection(environment)方法
		for (PropertySourceLocator locator : this.propertySourceLocators) {
   
            // 默认情况只有一个实现类ConfigServicePropertySourceLocator,它实现了读取远程配置中心配置参数
			Collection<PropertySource<?>> source = locator.locateCollection(environment);
			if (source == null || source.size() == 0) {
   
				continue;
			}
			List<PropertySource<?>> sourceList = new ArrayList<>();
			for (PropertySource<?> p : source) {
   
				sourceList.add(new BootstrapPropertySource<>(p));
			}
			logger.info("Located property source: " + sourceList);
			composite.addAll(sourceList)
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值