spring cloud连载第一篇之bootstrap context

本文介绍了Spring Cloud中的应用上下文服务,包括引导上下文的作用及其与主应用上下文的关系,阐述了如何通过不同配置区分两者并实现属性覆盖,还提供了自定义配置的方法。

1. Spring Cloud Context: Application Context Services(应用上下文服务)

1.1 The Bootstrap Application Context(引导上下文)

一个spring cloud应用会创建一个“bootstrap”context,它是主应用的parent context。它负责加载外部资源的配置属性并且解释本地外部配置文件中的属性。

这里有两个context,一个是spring boot的main context,另一个是spring cloud的bootstrap context,这两个context共享同一个环境,也就是说他们共享spring项目的外部配置属性。

默认情况下,bootstrap属性(并非是bootstrap.properties而是那些在bootstrap阶段加载的属性)是以高优先级的方式添加的,所以无法被本地配置覆盖。

bootstrap context和main context使用不同的方法定位外部配置,你可以使用bootstrap.yml来替代application.yml来为bootstrap context添加配置,这样就可以区分开bootstrap context和main context。

可以通过在系统属性中设置spring.cloud.bootstrap.enabled=false来禁用bootstrap程序。

1.2 Application Context Hierarchies(应用上下文层级)

如果你通过SpringApplication或者SpringApplicationBuilder构建了一个application context,那么bootstrap context将会作为它的parent context被添加。

spring的一个特性是child context会从它的parent context中继承属性资源和配置文件,因此main application context有一些额外的属性资源:

“bootstrap”:如果在bootstrap context中发现PropertySourceLocators并且含有非空属性,那么一个CompositePropertySource将会以高优先级出现。

“applicationConfig”:如果你有一个bootstrap.yml,并且设置了配置bootstrap context的属性,那么它们将会被添加到child context中。但是它们具有比application.yml或者其他配置更低的优先级。

由于资源属性的排序规则,“bootstrap”入口具有高优先级。注意这不包括bootstrap.yml中的数据(具有较低优先级,可以用来设置默认属性)。

1.3 Changing the Location of Bootstrap Properties

bootstrap.yml可以通过在系统属性中设置spring.cloud.bootstrap.name或者spring.cloud.bootstrap.location来指定。

如果有一个激活的配置文件(通过spring.profiles.active或者Environment API设置),那么这些文件中的属性都会被加载。

1.4 Overriding the Values of Remote Properties(覆盖远程属性的值)

通过bootstrap context添加到应用中的属性资源可能经常是“远程”的,例如从Spring Cloud Config Server读取的属性。默认情况下,他们不能被本地覆盖。

如果你希望让你的应用通过系统属性或者本地配置来重写那些远程配置,可以通过设置远程属性资源spring.cloud.config.allowOverride=true(在本地设置无效)。

一旦设置了上面的标志,就可以通过下面两个远程属性来控制远程属性和系统属性跟本地配置的关系:

spring.cloud.config.overrideNone=true:远程属性可以被本地任意属性资源覆盖

spring.cloud.config.overrideSystemProperties=false:仅仅系统属性,命令行参数和环境变量(不包括配置文件)可以覆盖远程设置。

1.5 Customizing the Bootstrap Configuration(自定义bootstrap配置)

bootstrap context可以被设置来做任何你想要做的事,只要在/META-INF/spring.factories文件中配置org.springframework.cloud.bootstrap.BootstrapConfiguration的值即可。

它的值是以逗号分隔的@Configuration类的全限定名。所以任何你想要在main application context中注入的bean都可以在这里配置。如果你希望控制启动顺序,在类上添加@Order注解(默认顺序为最后)。

注意:不要bootstrap配置被main context加载到,即不能被@ComponentScan和@SpringBootApplication注解的配置类覆盖到。

bootstrap程序最后将初始化器注入到main SpringApplication实例中。首先,通过spring.factories中配置的类来创建bootstrap context,然后所有ApplicationContextInitializer的bean将会被添加到main SpringApplication中,在其启动前。

1.6 Customizing the Bootstrap Property Sources(定制化bootstrap属性资源)

通过bootstrap程序添加的外部配置的默认属性资源是Spring Cloud Config Server。但是可以通过添加PropertySourceLocator类型的bean到bootstrap context中(通过spring.factories)来添加额外的资源。

举个

### Spring Cloud Bootstrap的作用 Spring Cloud Bootstrap用于早期阶段的配置引导,在应用程序启动之前完成必要的设置工作。这使得某些组件可以在常规的应用程序上下文初始化前获取其所需的配置数据[^1]。 对于一些特定场景下的需求,比如从远程服务器拉取加密密钥或者连接至配置中心读取全局参数等操作来说非常重要。通过这种方式可以确保当主要业务逻辑开始执行时已经具备了所有必需的信息资源[^3]。 ### 配置方式 #### 使用`bootstrap.yml` 在实际开发过程中,可以通过定义名为`bootstrap.yml`(也可以是`.properties`) 的特殊文件来进行此类预处理性质的工作。该文件会被优先加载,并且其中的内容能够影响到后续整个应用生命周期内的行为模式。 ```yaml spring: application: name: example-service # 应用名称 cloud: config: uri: http://config-server-url # 配置中心地址 ``` 这段YAML片段展示了如何指定一个服务的名字以及它所依赖的远端配置仓库的位置。这对于实现集中式的管理和分发环境敏感型设定非常有用处。 #### 动态刷新支持 值得注意的是,为了适应运行期间可能发生的变更情况,部分功能模块还提供了自动更新机制。这意味着一旦检测到了新的版本,则无需重启实例即可使最新的调整生效。 例如,如果正在利用Eureka作为注册表的话,那么每当有成员加入或离开集群之时都会及时同步最新状态给其他节点知晓;又或者是针对Hystrix熔断策略而言,也能做到在线修改阈值而不干扰现有调用链路正常运作[^4]。 #### 创建Bootstrap Context 具体来讲,在Spring Cloud环境下会构建出两个独立却又相互关联着的IoC容器——即所谓的“BootStrap Context” 和 “Application Context”。前者专门用来承载那些只读性强、变动频率低的基础性选项(如上所述),后者则继续沿用了传统意义上的概念范畴去容纳其余各类Bean对象及其关系网结构。 ```java public class ParentContextApplicationContextInitializer { private ApplicationContext parent; @Override public void initialize(ConfigurableApplicationContext applicationContext) { if (applicationContext != this.parent) { // 设置应用上下文的父应用上下文(容器) applicationContext.setParent(this.parent); // 设置应用监听器,说明存在着父子应用上下文事件 applicationContext.addApplicationListener(EventPublisher.INSTANCE); } } } ``` 上述Java代码演示了一个简化版的初始化流程:将子级ApplicationContext绑定到预先准备好的Parent之上,从而形成层次化的管理体系。这样做不仅有助于提高灵活性同时也增强了系统的可维护性和扩展能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值