Springcloud 引导上下文

      SpringCloud为我们提供了bootstrap.properties的属性文件,我们可以在该属性文件里做我们的服务配置。可是,我们知道SpringBoot已经为我们提供了做服务配置的属性文件application.properties,那么这两个配置文件有什么区别呢?在SpringCloud里是否能用bootstrap代替application做服务的配置?要解决这个问题,我们必须先讨论一下SpringCloud的引导。

 一、  官方文档描述

引导应用程序上下文

  一个Spring Cloud应用程序通过创建一个“引导”上下文来进行操作,这个上下文是主应用程序的父上下文。开箱即用,负责从外部源加载配置属性,还解密本地外部配置文件中的属性。这两个上下文共享一个Environment,这是任何Spring应用程序的外部属性的来源。Bootstrap属性的优先级高,因此默认情况下不能被本地配置覆盖。

引导上下文使用与主应用程序上下文不同的外部配置约定,因此使用bootstrap.yml application.yml(或.properties)代替引导和主上下文的外部配置。例:bootstrap.yml

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

如果您的应用程序需要服务器上的特定于应用程序的配置,那么设置spring.application.name(在bootstrap.ymlapplication.yml)中是个好主意。

您可以通过设置spring.cloud.bootstrap.enabled=false(例如在系统属性中)来完全禁用引导过程。

 

二、引导上下文

 1. 关于引导上下文位置

  

      这里我们可以发现几个关键的类,其中BootstrapApplicationListener是核心中的核心,可自行查看源码

     这个类是一个监听器,它用于监听ApplicationEnvironmentPreparedEvent事件,而EventPublishingRunListener在SpringBoot启动时会触发该事件。如果不理解的这个类的朋友请务必先了解SpringBoot启动过程

    2.这个上下文是主应用程序的父上下文

      这个工作主要分为两个层面:1.创建上下文引导 2.设置为其为当前程序的父级上下文

     

   1) 我们先看看onApplicationEvent方法,该方法首先读取spring.cloud.bootstrap.enabled的属性值如果为false,那么就直接return。这也就是官方文档里的说明可以用此属性禁用引导的理由。

   2)紧接着它会从当前应用程序SpringApplication试着在所有的ApplicationInitializer中获取ParentContextApplicationContextInitializer,如果找到的话就把该类下的parent做为引导上下文。

   3)如果没有找到ParentContextApplicationContextInitializer,则通过 bootstrapServiceContext方法来创建引导上下文,其中如下代码请大家留意下:

    List<String> names = SpringFactoriesLoader.loadFactoryNames(BootstrapConfiguration.class, classLoader);

         看到SpringFactoriesLoader不用想一定会在META-INF/spring.factoies里找配置的BootstrapConfiguration的进行实例化

             

 4)通过如下代码创建引导上下文对象:

复制代码
SpringApplicationBuilder builder = new SpringApplicationBuilder().profiles(environment.getActiveProfiles()).bannerMode(Mode.OFF).environment(bootstrapEnvironment).properties("spring.application.name:" + configName).registerShutdownHook(false).logStartupInfo(false).web(false);if (environment.getPropertySources().contains("refreshArgs")) {// If we are doing a context refresh, really we only want to refresh the// Environment, and there are some toxic listeners (like the// LoggingApplicationListener) that affect global static state, so we need a// way to switch those off.builder.application().setListeners(filterListeners(builder.application().getListeners()));}List<Class<?>> sources = new ArrayList<>();for (String name : names) {Class<?> cls = ClassUtils.resolveClassName(name, null);try {cls.getDeclaredAnnotations();}catch (Exception e) {continue;}sources.add(cls);}AnnotationAwareOrderComparator.sort(sources);builder.sources(sources.toArray(new Class[sources.size()]));final ConfigurableApplicationContext context = builder.run();
复制代码

  

5)最后通过如下方法设置引导上下文为当前应用程序的上下文:

// Make the bootstrap context a parent of the app contextaddAncestorInitializer(application, context);

 

   3. 负责从外部源加载配置属性,还解密本地外部配置文件中的属性

  

    开箱即用,理解起来很简单。通过2.2分析,引导程序在SpringBoot的启动前就帮我们创建好了,当然也就开箱即用了。

 下面我们看一下spring-cloud-context.jar下的META-INF/spring.factoies文件:

    

# 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.bootstrap.LoggingSystemShutdownListener,\
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.context.PropertyPlaceholderAutoConfiguration
View Code

 我们来看一下  BootstrapConfiguration下面配置的引导程序类:

    org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration:这个类主要解析加载外部化配置属性

    org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration:主要配置文件中前缀为{cipher}的相关解密,熟悉spring-boot-starter-security在springcloud应用的朋友一定不陌生

    org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration:主要是监听EnvironmentChangeEvent事件用于刷新@ConfigurationProperties标记的配置

    org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration:主要解析配置文件中的${}占位符

 

 4. 这两个上下文共享一个Environment

       既然引导上下文为当前主程序的父级上下文,那么就可以确定他们共享Environment,至于为什么请阅读文章第一部分

 5. BootStrap属性的优先级高,因此默认情况下不能被本地配置覆盖

      对于引导程序bootstrap.yml比application.yml优先级更高,更不可能被application.yml文件里的所覆盖

 三、总结

  1)引导程序上下文在prepareEnvironment的阶段就会被创建,创建时会读取bootstrap.properties|yml 在内容作为引导配置, 因此bootstrap优先于application加载。引导程序非常类似于bios,而bootstrap.application就相当于设置bios的相关参数

  2)boostrap的属性文件在以下情景下会使用:

    配置中心:config-server里请用bootstrap属性文件

      解密属性文件时,最好使用bootstrap属性文件

    需要自定义引导程序时使用bootstrap属性文件,主要一定不要被我们主程序扫描到

  3)application会覆盖bootstrap中的非引导配置,因此不建议两种类型配置文件同时存在。简单粗暴的做法是在springcloud应用中用bootstrap属性文件代替application一统江湖嘛,毕竟Envrionment是共享的。

  4)  在阅读官方文档时,一定要结合源代码深入分析,才能更好的理解其用意

转载于:https://www.cnblogs.com/whx7762/p/11232019.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flask-1-05-CookieSession

接下来我会演示一下设置Cookie 读取Cookie 删除Cookie&#xff0c;以及添加Cookie的原理 接下来我们分别定义3个视图为 set_cookie、get_cookie、del_cookie # coding:utf-8from flask import Flask, make_response, requestapp Flask(__name__)app.route("/set_cookie&q…

解决跨域问题:No ‘Access-Control-Allow-Origin‘ header is present on the requested resource.

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 PS&#xff1a;如果遇到 这个问题 Request header field Content-Type is not allowed by Access-Control-Allow-Headers&#xff0c;解…

vue 设置全局变量、指定请求的 baseurl

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 安装 axios&#xff1a; npm install axios --save-dev 2. 新建一个 Base.vue 文件&#xff0c;书写内容如下&#xff1a; <sc…

JAXP进行DOM和SAX解析

1.常用XML的解析方式&#xff1a;DOM和SAX 1&#xff09;DOM思想&#xff1a;将整个XML加载内存中&#xff0c;形成文档对象&#xff0c;所以对XML操作都对内存中文档对象进行。 2&#xff09;SAX思想&#xff1a;一边解析&#xff0c;一边处理&#xff0c;一边释放内存资源---…

VScode 格式化代码快捷键、修改快捷键

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 请看仔细快捷键是&#xff1a; shift alt F // 我是从 eclipse 转的 idea &#xff0c;现在再用 vscode , 一直条件反射的按的 c…

TCP报文格式详解

TCP协议只定义了一种报文格式 建立、拆除连接、传输数据使用同样的报文 TCP报文格式 TCP报文段首部&#xff08;20个字节&#xff09; 源端口和目的端口&#xff1a;各占2个字节&#xff0c;16比特的端口号加上32比特的IP地址&#xff0c;共同构成相当于传输层服务访问点的地址…

Vue 生命周期中 mounted( ) 和 created( ) 的区别

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、什么是生命周期&#xff1f; 用通俗的语言来说&#xff0c;就是Vue中实例或者组件从创建到消灭中间经过的一系列过程。虽然不太严谨…

基于java的数据结构学习——数组实现的栈以及简单应用

栈 Stack 栈是一种线性结构相比数组&#xff0c;栈对应的操作是数组的子集只能从一端添加元素&#xff0c;也只能从一端取出元素这一端称为栈顶栈是一种后进先出的数据结构 栈的应用 无处不在的Undo操作&#xff08;撤销&#xff09;括号匹配&#xff08;编译器&#xff09;程…

2013驾考科目三考试难点解析

原来规定科目三考试上车准备、起步、直线行驶等13个道路驾驶技能项目。123号令实施后&#xff0c;科目三考试分两部分。道路驾驶技能考试项目增加到16项&#xff0c;增加了加减挡位操作、路口左转弯、路口右转弯3个考试项目&#xff0c;驾驶里程也增加。如何顺利通过2013驾考科…

基于java的数据结构学习——数组实现的队列和循环队列及性能对比

队列 Queue 队列也是一种线性结构相比数组&#xff0c;队列对应的操作是数组的子集只能从一端&#xff08;队尾&#xff09;添加元素&#xff0c;只能从另一端&#xff08;队首&#xff09;取出元素队列是一种先进先出的数据结构 队列的实现及复杂度分析 Queue<E> voi…

新手如何准确的控制油门

日常练车还不赖&#xff0c;可是一换车就容易加大油门儿&#xff0c;有啥子办法能美好的扼制油呢?和调的坐位有关系吗? 答&#xff1a;油门儿跟刹车被视为交通工具扼制的魂灵。交通工具引擎发动机的油门儿&#xff0c;通常是靠踏板来扼制的&#xff0c;也称加速踏板&#xff…

vue 项目:文件夹 结构 、配置详解

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 项目配置 首先&#xff0c;在确定好使用的框架和组件库后&#xff0c;先要大致了解它们&#xff0c;做到文档基本熟悉。本次开发使用…

DIV 半透明层、 CSS实现网页 背景半透明

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 DIV半透明实现&#xff0c;使用CSS实现DIV成半透明效果&#xff0c;CSS实现层与背景半透明效果。 一、DIV CSS半透明基础介绍 - …

加速时如何换挡

加速时如何换挡&#xff0c;您知道吗?为了使换挡过程顺利进行&#xff0c;变速器内齿轮平稳啮合&#xff0c;必须掌握好发动机转速&#xff0c;在适当时机推动变速杆操纵齿轮啮合。为此&#xff0c;要通过反复练习&#xff0c;一边踩踏油门踏板&#xff0c;一边听发动机运转声…

vue 项目 引用(外部) js、css

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我的工程结构&#xff1a; 1. 引入 css 有 2 种方式&#xff1a; 方式 1 <script type"text/javascript">import .…

自动挡车挡位的基本知识介绍

一般来说&#xff0c;自动档汽车的自动变速器的档位分为P、R、N、D、2 (或S)、L(或1)等。下面分别详细介绍如下&#xff1a; P (Parking) 停车档&#xff0c;或称泊车档&#xff1a; P用作停车之用&#xff0c;它是利用机械装置去锁紧汽车的转动部分&#xff0c;使汽车不能移动…

解决:(iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8082 -j DNAT --to-destin

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 用 docker 部署一个前端工程&#xff0c;run 后容器有了&#xff0c;却不是运行状态&#xff0c;是创建状态&#xff0c;于是我执行 …

无损压缩——Huffman编码

最近项目中涉及到人脸关键点中神经网络的压缩&#xff0c;采用了性能较好的哈夫曼编码进行。 源码地址&#xff1a;https://github.com/believeszw/HuffmanCompress 1 引言 哈夫曼&#xff08;Huffman&#xff09;编码算法是基于二叉树构建编码压缩结构的&#xff0c;它是数据…

26条安全开车经验 开车20年老司机分享

总有些人&#xff0c;觉得自己开车技术比舒马赫牛叉&#xff0c;市区高速漂移无比潇洒。也总有些人&#xff0c;觉得路是自家的铺的&#xff0c;爱怎么开就怎么开&#xff0c;爱停哪就停哪&#xff0c;哪个不服打开车窗就是一句国骂一个中指。其实他们都没有意识到&#xff0c;…

解决:Request header field Content-Type is not allowed by Access-Control-Allow-Headers

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 前端 vue 工程 post 请求后端接口&#xff0c;报错&#xff1a; Request header field Content-Type is not allowed by Access-Con…