SpringCloud学习笔记(二)-Config配置

简介: Config分为三个部分:ConfigServer ConfigClient 配置仓库

一、ConfigServer如何提供配置


SpringCloud中申明ConfigServer时,通过@EnableConfigServer开启ConfigServer配置。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(ConfigServerConfiguration.class)
public @interface EnableConfigServer {
}


而EnableConfigServer中又引入了ConfigServerConfiguration,申明了内部类Maker,并装配为一个Bean。

@Configuration
public class ConfigServerConfiguration {
    class Marker {}
    @Bean
    public Marker enableConfigServerMarker() {
        return new Marker();
    }
}


通过ConfigServerConfiguration.Maker又开启了ConfigServerAutoConfiguration配置(通过@ConditionalOnBean(ConfigServerConfiguration.Marker.class)开启,在装配Maker时会执行该配置)。

@Configuration
@ConditionalOnBean(ConfigServerConfiguration.Marker.class)
@EnableConfigurationProperties(ConfigServerProperties.class)
@Import({ EnvironmentRepositoryConfiguration.class, CompositeConfiguration.class, ResourceRepositoryConfiguration.class,
        ConfigServerEncryptionConfiguration.class, ConfigServerMvcConfiguration.class, TransportConfiguration.class })
public class ConfigServerAutoConfiguration {
}


通过@Import引入了6个重要的配置类


EnvironmentRepositoryConfiguration:环境仓库配置,是关键的配置类


CompositeConfiguration:混合配置,用于多环境下配置资源的加载


ResourceRepositoryConfiguration:资源仓库相关配置


ConfigServerEncryptionConfiguration:ConfigServer加密相关配置


ConfigServerMvcConfiguration:对外暴露的MVC相关配置


TransportConfiguration:运行transport命令前,配置回调


EnvironmentRepositoryConfiguration的配置


环境仓库的配置又细分为JDBCVaultsvnNative(本地)Git等配置,默认是Git配置.


多种配置方式,最终都会被装配成EnvironmentRepository,以本地配置装配为例看下类图结构:


image.png

EnvironmentRepository


1. NativeEnvironmentRepository本地配置加载


2. GitRepositoryConfiguration Git配置加载


等等...


二、ConfigClient的调用


ConfigServer在启动的时候会申明一个REST接口(EnvironmentController)当有配置客户端查询请求时,通过调用EnvironmentRepository.findOne方法返回一个Environment对象,客户端反序列化得到Environment对象。

@RequestMapping("/{name}/{profiles:.*[^-].*}")
    public Environment defaultLabel(@PathVariable String name,
            @PathVariable String profiles) {
        return labelled(name, profiles, null);
}
@RequestMapping("/{name}/{profiles}/{label:.*}")
    public Environment labelled(@PathVariable String name, @PathVariable String profiles,
            @PathVariable String label) {
        if (label != null && label.contains("(_)")) {
            // "(_)" is uncommon in a git branch name, but "/" cannot be matched
            // by Spring MVC
            label = label.replace("(_)", "/");
        }
        Environment environment = this.repository.findOne(name, profiles, label);
        return environment;
}


findOne根据配置信息解析过滤配置属性,封装为Environment对象返回给客户端。

public class NativeEnvironmentRepository{
//在ConfigClient启动时调用
//config:文件名称,即在Configclient中配置的config.name
//profile:ConfigClient中配置的config.profile
@Override
public Environment findOne(String config, String profile, String label) {
        //启动一个SpringBoot内部微型工程,用于加载配置文件
        SpringApplicationBuilder builder = new SpringApplicationBuilder(
                PropertyPlaceholderAutoConfiguration.class);
        ConfigurableEnvironment environment = getEnvironment(profile);
        builder.environment(environment);
        builder.web(false).bannerMode(Mode.OFF);
        if (!logger.isDebugEnabled()) {
            // Make the mini-application startup less verbose
            builder.logStartupInfo(false);
        }
        String[] args = getArgs(config, profile, label);
        // Explicitly set the listeners (to exclude logging listener which would change
        // log levels in the caller)
        builder.application()
                .setListeners(Arrays.asList(new ConfigFileApplicationListener()));
        ConfigurableApplicationContext context = builder.run(args);
        environment.getPropertySources().remove("profiles");
        try {
            //过滤出所有配置
            return clean(new PassthruEnvironmentRepository(environment).findOne(config,
                    profile, label));
        }
        finally {
            context.close();
        }
    }
}


返回的Environment对象也可以直接通过在地址栏输入http连接看到


image.png

Environment


相关文章
|
2天前
|
JSON Java Nacos
SpringCloud 应用 Nacos 配置中心注解
在 Spring Cloud 应用中可以非常低成本地集成 Nacos 实现配置动态刷新,在应用程序代码中通过 Spring 官方的注解 @Value 和 @ConfigurationProperties,引用 Spring enviroment 上下文中的属性值,这种用法的最大优点是无代码层面侵入性,但也存在诸多限制,为了解决问题,提升应用接入 Nacos 配置中心的易用性,Spring Cloud Alibaba 发布一套全新的 Nacos 配置中心的注解。
|
12天前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
28 6
|
12天前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
33 5
|
12天前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
23 5
|
3月前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
3月前
|
Java 开发工具 对象存储
简化配置管理:Spring Cloud Config与Netflix OSS中的动态配置解决方案
简化配置管理:Spring Cloud Config与Netflix OSS中的动态配置解决方案
53 2
|
4月前
|
Cloud Native Java Nacos
Spring Cloud Config、Apollo、Nacos和Archaius对比
这篇文章对比了Spring Cloud Config、Apollo、Nacos和Archaius这四种配置中心的适应场景、优缺点。文中讨论了它们的功能特点,例如Spring Cloud Config的集中化配置管理和动态刷新能力,Apollo的实时配置推送和权限治理,Nacos的服务发现和管理功能,以及Archaius的动态配置更新能力。文章指出选择配置中心应根据项目需求和架构来决定,并提供了一个对比图来帮助读者更直观地理解这些工具的差异。
127 1
Spring Cloud Config、Apollo、Nacos和Archaius对比
|
2月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
47 0
|
4月前
|
Java 微服务 Spring
Spring Cloud全解析:配置中心之解决configserver单点问题
但是如果该configserver挂掉了,那就无法获取最新的配置了,微服务就出现了configserver的单点问题,那么如何避免configserver单点呢?
|
4月前
|
Java 数据库连接 Nacos
SpringCloud微服务配置管理、配置热更新
SpringCloud微服务配置管理、配置热更新
127 0