添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
近视的大象  ·  论文笔记5|AttentionDTA ...·  1 年前    · 
开心的机器人  ·  cimoc ...·  1 年前    · 
没有腹肌的麦片  ·  Loading Related ...·  2 年前    · 

作者其他技术文章

1) 初识 Spring Boot-Spring Boot教程深入浅出系列

2) spring cloud 入门教程
3) application.yml 与 application.properties详解

4) SpringCloud入门之Spring Boot多环境配置切换指南

5) 23种常用设计模式快速入门教程

6) Kibana从入门到精通

7) logstash快速入门实战指南

8) Elasticsearch从入门到精通

9) Redis常用命令

10) 详解Maven用户的配置settings.xml

11) SpringCloud入门之YAML格式文件规范学习

12) Oracle性能优化之查询语句通用原则

13) #ifndef、#def、#endif说明

14) BDD 如何让产品负责人、设计师、开发人员和测试人员的生活更轻松

SpringBoot默认支持properties和YAML两种格式的配置文件。前者格式简单,但是只支持键值对。如果需要表达列表,最好使用YAML格式。SpringBoot支持自动加载约定名称的配置文件,例如 application.yml 。如果是自定义名称的配置文件,就要另找方法了。可惜的是,不像前者有 @PropertySource 这样方便的加载方式,后者的加载必须借助编码逻辑来实现。

一、bootstrap.yml(bootstrap.properties)与application.yml(application.properties)执行顺序

bootstrap.yml(bootstrap.properties)用来在程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等

application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。

bootstrap.yml 先于 application.yml 加载

二、典型的应用场景如下:

  • 当使用 Spring Cloud Config Server 的时候,你应该在 bootstrap.yml 里面指定 spring.application.name 和 spring.cloud.config.server.git.uri
  • 和一些加密/解密的信息
  • 技术上,bootstrap.yml 是被一个父级的 Spring ApplicationContext 加载的。这个父级的 Spring ApplicationContext是先加载的,在加载application.yml 的 ApplicationContext之前。

    为何需要把 config server 的信息放在 bootstrap.yml 里?

    当使用 Spring Cloud 的时候,配置信息一般是从 config server 加载的,为了取得配置信息(比如密码等),你需要一些提早的引导配置。因此,把 config server 信息放在 bootstrap.yml,用来加载在这个时期真正需要的配置信息。

    三、高级使用场景

    启动上下文

    Spring Cloud会创建一个`Bootstrap Context`,作为Spring应用的`Application Context`的父上下文 初始化的时候,`Bootstrap Context`负责从外部源加载配置属性并解析配置。 这两个上下文共享一个从外部获取的`Environment`。`Bootstrap`属性有高优先级,默认情况下,它们不会被本地配置覆盖。 `Bootstrap context`和`Application Context`有着不同的约定,所以新增了一个`bootstrap.yml`文件,而不是使用`application.yml` (或者`application.properties`)。保证`Bootstrap Context`和`Application Context`配置的分离。下面是一个例子: **bootstrap.yml**

    spring:
      application:
        name: foo
      cloud:
        config:
          uri: ${SPRING_CONFIG_URI:http://localhost:8888}

    推荐在`bootstrap.yml` or `application.yml`里面配置`spring.application.name`. 你可以通过设置`spring.cloud.bootstrap.enabled=false`来禁用`bootstrap`。

    应用上下文层次结构

    如果你通过`SpringApplication`或者`SpringApplicationBuilder`创建一个`Application Context`,那么会为spring应用的`Application Context`创建父上下文`Bootstrap Context`。在Spring里有个特性,子上下文会继承父类的`property sources` and `profiles` ,所以`main application context` 相对于没有使用Spring Cloud Config,会新增额外的`property sources`。额外的`property sources`有:

  • “bootstrap” : 如果在 Bootstrap Context 扫描到 PropertySourceLocator 并且有属性,则会添加到CompositePropertySource Spirng Cloud Config就是通过这种方式来添加的属性的 ,详细看源码 ConfigServicePropertySourceLocator `。下面也也有一个例子自定义的例子。
  • “applicationConfig: [classpath:bootstrap.yml]” ,(如果有 spring.profiles.active=production 则例如 applicationConfig: [classpath:/bootstrap.yml]#production): 如果你使用 bootstrap.yml 来配置 Bootstrap Context ,他比 application.yml 优先级要低。它将添加到子上下文,作为Spring Boot应用程序的一部分。下文有介绍。
  • 由于优先级规则, Bootstrap Context 不包含从 bootstrap.yml 来的数据,但是可以用它作为默认设置。

    你可以很容易的 扩展任何你建立的上下文层次 ,可以使用它提供的接口,或者使用 SpringApplicationBuilder 包含的方法( parent() child() sibling() )。 Bootstrap Context 将是最高级别的父类。扩展的每一个 Context 都有有自己的 bootstrap property source (有可能是空的)。扩展的每一个 Context 都有不同 spring.application.name 。同一层层次的父子上下文原则上也有一有不同的名称,因此,也会有不同的Config Server配置。子上下文的属性在相同名字的情况下将覆盖父上下文的属性。

    注意 SpringApplicationBuilder 允许共享 Environment 到所有层次,但是不是默认的 。因此,同级的兄弟上下文不在和父类共享一些东西的时候不一定有相同的 profiles 或者 property sources

    修改Bootstrap属性配置

    源码位置 BootstrapApplicationListener

       String configName = environment.resolvePlaceholders("${spring.cloud.bootstrap.name:bootstrap}");
        String configLocation = environment.resolvePlaceholders("${spring.cloud.bootstrap.location:}");
        Map<String, Object> bootstrapMap = new HashMap<>();bootstrapMap.put("spring.config.name",configName);
        if(StringUtils.hasText(configLocation)){
            bootstrapMap.put("spring.config.location", configLocation);
    

     bootstrap.yml是由spring.cloud.bootstrap.name(默认:”bootstrap”)或者spring.cloud.bootstrap.location(默认空)。这些属性行为与spring.config.*类似,通过它的Environment来配置引导ApplicationContext。如果有一个激活的profile(来源于spring.profiles.active或者Environment的Api构建),例如bootstrap-development.properties 就是配置了profiledevelopment的配置文件.

    覆盖远程属性

    property sourcesbootstrap context 添加到应用通常通过远程的方式,比如”Config Server”。默认情况下,本地的配置文件不能覆盖远程配置,但是可以通过启动命令行参数来覆盖远程配置。如果需要本地文件覆盖远程文件,需要在远程配置文件里设置授权 
    spring.cloud.config.allowOverride=true(这个配置不能在本地被设置)。一旦设置了这个权限,你可以配置更加细粒度的配置来配置覆盖的方式,

    比如: 
    spring.cloud.config.overrideNone=true 覆盖任何本地属性 
    spring.cloud.config.overrideSystemProperties=false 仅仅系统属性和环境变量 
    源文件见PropertySourceBootstrapProperties

    自定义启动配置

    bootstrap context是依赖/META-INF/spring.factories文件里面的org.springframework.cloud.bootstrap.BootstrapConfiguration条目下面,通过逗号分隔的Spring  @Configuration类来建立的配置。任何main application context需要的自动注入的Bean可以在这里通过这种方式来获取。这也是ApplicationContextInitializer建立@Bean的方式。可以通过@Order来更改初始化序列,默认是”last”。

    # spring-cloud-context-1.1.1.RELEASE.jar
    # spring.factories
    # AutoConfiguration
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,\
    org.springframework.cloud.autoconfigure.RefreshAutoConfiguration,\
    org.springframework.cloud.autoconfigure.RefreshEndpointAutoConfiguration,\
    org.springframework.cloud.autoconfigure.LifecycleMvcEndpointAutoConfiguration
    # Application Listeners
    org.springframework.context.ApplicationListener=\
    org.springframework.cloud.bootstrap.BootstrapApplicationListener,\
    org.springframework.cloud.context.restart.RestartListener
    # Bootstrap components
    org.springframework.cloud.bootstrap.BootstrapConfiguration=\
    org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration,\
    org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration,\
    org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,\
    org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration

    小心,你添加的自定义BootstrapConfiguration类没有错误的@ComponentScanned到你的主应用上下文,他们可能是不需要的。使用一个另外的包不被@ComponentScan或者@SpringBootApplication注解覆盖到。


    bootstrap context通过spring.factories配置的类初始化的所有的Bean都会在SpingApplicatin启动前加入到它的上下文里去。

    自定义引导配置来源:Bootstrap Property Sources

    默认的`property source`添加额外的配置是通过配置服务(Config Server),你也可以自定义添加`property source`通过实现`PropertySourceLocator`接口来添加。你可以使用它加配置属性从不同的服务、数据库、或者其他。

  • 下面是一个自定义的例子:
  • @Configuration
    public class CustomPropertySourceLocator implements PropertySourceLocator {
        @Override
        public PropertySource<?> locate(Environment environment) {
            return new MapPropertySource("customProperty",
                    Collections.<String, Object>singletonMap("property.from.sample.custom.source", "worked as intended"));
    

    EnvironmentApplicationContext建立,并传入property sources(可能不同个profile有不同的属性),所以,你可以从Environment寻找找一些特别的属性。比如spring.application.name,它是默认的Config Server property source

    如果你建立了一个jar包,里面添加了一个META-INF/spring.factories文件:

    org.springframework.cloud.bootstrap.BootstrapConfiguration=sample.custom.CustomPropertySourceLocator

    那么,”customProperty“的PropertySource将会被包含到应用。

    关于Java平台下微服务实践可以参考笔者以下文章

    Spring Cloud 配置application.yml与bootstrap.yml快速入门
    Spring Cloud 安全简介
    Spring Cloud Stream 简介
    Spring Cloud 任务简介
    使用 Zuul、Ribbon、Feign、Eureka 和 Sleuth、Zipkin 创建简单spring cloud微服务用例-spring cloud 入门教程
    微服务集成SPRING CLOUD SLEUTH、ELK 和 ZIPKIN 进行监控-spring cloud 入门教程
    使用Hystrix 、Feign 和 Ribbon构建微服务-spring cloud 入门教程

    使用 Spring Boot Admin 监控微服务-spring cloud 入门教程

    基于Redis做Spring Cloud Gateway 中的速率限制实践-spring cloud 入门教程
    集成SWAGGER2服务-spring cloud 入门教程
    Hystrix 简介-spring cloud 入门教程
    Hystrix 原理深入分析-spring cloud 入门教程 
    使用Apache Camel构建微服务-spring cloud 入门教程
    集成 Kubernetes 来构建微服务-spring cloud 入门教程
    集成SPRINGDOC OPENAPI 的微服务实践-spring cloud 入门教程
    SPRING CLOUD 微服务快速指南-spring cloud 入门教程
    基于GraphQL的微服务实践-spring cloud 入门教程
    最火的Spring Cloud Gateway 为经过身份验证的用户启用速率限制实践-spring cloud 入门教程