【SpringCloud】Config源码解析

e246a1dda09849a5a89535a62441565d.png

config是一个微服务配置组件,为微服务提供集中化的配置管理服务。config包含服务端和客户端,客户端在启动服务时从服务端拉取配置信息,服务端响应客户端的请求提供具体的配置。本章分析config组件配置信息的拉取过程

1、config服务端

服务端响应请求的过程比较简单,主要由spring-cloud-config-server包下EnvironmentController负责

@RestController
@RequestMapping(
    method = {RequestMethod.GET},
    path = {"${spring.cloud.config.server.prefix:}"}
)
public class EnvironmentController {

    /**
     * 根据环境类型和文件名拉取信息
    **/ 
    @RequestMapping(
        path = {"/{name}/{profiles:.*[^-].*}"},
        produces = {"application/json"}
    )
    public Environment defaultLabel(@PathVariable String name, @PathVariable String profiles) {
        return this.getEnvironment(name, profiles, (String)null, false);
    }


    public Environment getEnvironment(String name, String profiles, String label, boolean includeOrigin) {
        name = this.normalize(name);
        label = this.normalize(label);
        Environment environment = this.repository.findOne(name, profiles, label, includeOrigin);
        if (this.acceptEmpty || environment != null && !environment.getPropertySources().isEmpty()) {
            return environment;
        } else {
            throw new EnvironmentNotFoundException("Profile Not found");
        }
    }

}

getEnvironment方法会调用EnvironmentRepository接口的实现类来查找环境信息,类似dao层

public interface EnvironmentRepository {
    Environment findOne(String application, String profile, String label);

    default Environment findOne(String application, String profile, String label, boolean includeOrigin) {
        return this.findOne(application, profile, label);
    }
}

2、config客户端

springboot在启动时会调用applyInitializers方法,这个方法会遍历ApplicationContextInitializer接口的实现类并调用它们的initialize方法

【SpringBoot】SpringBoot源码解析第二章 SpringBoot的run方法-CSDN博客

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);
	}
}

config客户端中的PropertySourceBootstrapConfiguration类实现了ApplicationContextInitializer接口,它的工作就是拉取远程的配置信息并与本地信息整合

 public void initialize(ConfigurableApplicationContext applicationContext) {
        ...
        while(true) {
            Collection source;
            do {
                do {
                    ...
                    PropertySourceLocator locator = (PropertySourceLocator)var5.next();

                    // 拉取远程配置信息
                    source = locator.locateCollection(environment);
                } while(source == null);
            } while(source.size() == 0);
            ...
        }
    }

ConfigServicePropertySourceLocator是PropertySourceLocator接口的实现类,查看它的locate方法

@Retryable(
	interceptor = "configServerRetryInterceptor"
)
public PropertySource<?> locate(Environment environment) {
   ...
		for(int var11 = 0; var11 < var10; ++var11) {
			String label = var9[var11];
			...
			// 发送请求
			org.springframework.cloud.config.environment.Environment result 
				= this.getRemoteEnvironment(restTemplate, properties, label.trim(), state);
			...
		}
}

private Environment getRemoteEnvironment(RestTemplate restTemplate, ConfigClientProperties properties, String label, String state) {
	String path = "/{name}/{profile}";
	String name = properties.getName();
	String profile = properties.getProfile();
	String token = properties.getToken();
	...
	response = restTemplate.exchange(uri + path, HttpMethod.GET, entity, org.springframework.cloud.config.environment.Environment.class, args);
   ...
	}
}

locate方法发送具体的请求,拉取过来的远程信息会被整合入本地

3、总结

config服务端负责响应请求,config客户端在服务启动时会从服务端拉取配置信息

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值