Spring Cloud配置application.yml与bootstrap.yml区别及多profile配置 | Spring Cloud 6

news2024/9/25 13:23:12

一、前言

Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap,另外一种是 application

二、bootstrap与application (.yml/.properties)

2.1 两者区别

bootstrap.yml/bootstrap.propertiesapplication.yml/application.yml 都可以用来配置参数。

  • bootstrap.yml/bootstrap.properties :用来程序引导时执行,应用于更加早期配置信息读取。可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。

  • application.yml/application.yml :可以用来定义应用级别的, 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。

文件名.properties /文件名.yml文件名相同且同时存在时,先加载 .properties 文件,再加载 .yml 文件。

2.2 两者加载顺序

application.yml/.propertiesbootstrap.yml/.properties 在同一目录下:bootstrap先加载,application 后加载

  • bootstrap.yml/.properties 用于创建初始化 Bootstrap Context
  • application.yml/.properties用于创建初始化Application Context

bootstrap.yml/.propertiesapplication.yml/.properties 共享同一个 EnvironmentEnvironment 它是任何 Spring 应用程序的外部属性的来源。bootstrap.yml/.properties 属性以高优先级添加,因此默认情况下它们不能被本地配置覆盖。而 application.yml/.properties 的配置项可以被覆盖。

可通过参数spring.cloud.bootstrap.enabled=true完全禁用bootstrap

1.4 bootstrap(.yml/.properties)应用

  • 配置alibaba-nacos-config基本连接信息,用于获取远程所需配置。alibaba-nacos-config 基本连接信息就不能写到 application.yml/.properties中等到 Application Context 初始化时才读取。必须在 bootstrap.yml/.properties 里配置,在初始化Bootstrap Context时完成读取, 在Application Context 初始化时利用已读取的alibaba-nacos-config 基本连接信息从alibaba-nacos-config 中获取所需的远程配置信息。
  • 一些固定的不希望被覆盖的属性,如程序的名字。
  • 一些加解密的场景。

二、application多profile配置

更多详细配置及说明请见官网:

https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/#boot-features-external-config

3.1 启动时No active profile set, falling back to 1 default profile: “default”

相信有不少细心小伙伴在新启动一个spring boot项目时候会发现这样一条信息no active profile set, falling back to default profiles: default。为什么会出现这样的提示呢,我们先来看看profileprofileSpring对不同环境提供不同配置功能的支持,可以通过激活、 指定参数等方式快速切换环境profile。举个例子我们在开发,测试,生产用到的配置是不同的,那么通过profile就可以帮我们指定对应的环境用对应的配置,那么如何来指定呢?

3.2 多profile文件形式

格式:application-{profile}.properties/yml ,在resources目录下:

默认:application.properties
共用配置:application-common.properties
开发环境:application-dev.properties
生产环境:application-prod.properties
测试环境:application-test.properties

3.3 多profile在application配置激活

application.properties 中配置:

spring.profiles.active=dev

或在application.yml 中配置:

spring:
  profiles:
    active: dev

3.3.1 配置示例一

进行多配置激活,如下:

spring.profiles.active=dev,common

在这里插入图片描述

HelloWorldApplication.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import java.util.concurrent.TimeUnit;

@SpringBootApplication
public class HelloWorldApplication {

    public static void main(String[] args) throws InterruptedException {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(HelloWorldApplication.class, args);
        while (true) {
            //当动态配置刷新时,会更新到 Enviroment中,因此这里每隔一秒中从Enviroment中获取配置
            String name = applicationContext.getEnvironment().getProperty("name");
            String age = applicationContext.getEnvironment().getProperty("age");
            System.err.println("=========>>>>>>>>>>name :" + name + ",age :" + age);
            TimeUnit.SECONDS.sleep(1);
        }
    }
}

application.properties

spring.profiles.active=dev,common
name=default
age=0

application-common.properties

name=common

application-dev.properties

name=dev
age=18

运行结果

在这里插入图片描述

3.3.2 配置示例二

若项目同一目录同时存在以下四个文件:

bootstrap.properties
bootstrap.yml
application.properties
application.yml

bootstrap的配置先于application的配置加载,同时.properties的加载又先于.yml的加载,即加载优先级:

bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
  • 同一个配置属性bootstrap.propertiesbootstrap.yml文件中都存在时,那么properties中的配置会被加载,而忽略yml文件中的配置(即优先级高的配置覆盖优先级低的配置),不同配置相互互补。此处application(.properties/yml)同理。
  • 同一配置属性bootstrap.propertiesapplication.properties中都存在时,那么虽然优先加载bootstrap.properties但是会被applicatioin.properties中的配置覆盖,此时则变成了低优先级覆盖高优先的配置,所以网上很多文章所说的高优先级覆盖低优先级其实是不严谨的。
  • 不同的配置会进行互补操作,即Spring Boot会读取全部的配置文件,加载所有不同的配置项,汇成一个总的配置。

3.3.3 配置示例三

若项目同一目录同时存在以下四个文件:

bootstrap-dev.yml
bootstrap.properties
application-dev.yml
application.properties

此时的加载优先级变为:

bootstrap-dev.yml -> bootstrap.properties -> application-dev.yml -> application.properties。

同属性配置的覆盖问题和之前一样:

  • 同为bootstrap同为application的情况下,优先级高的覆盖优先级低的。
  • 同时存在bootstrapapplication时后者仍会覆盖前者中的配置。

举例1:假如此时只有bootstrap-dev.ymlbootstrap.properties且存在相同配置,则使用bootstrap-dev.yml中的配置,此时遵循高优先级覆盖低优先级。

举例2:假如此时有bootstrap-dev.ymlbootstrap.propertiesapplication.properties且存在相同配置,则使用application.properties中的配置,遵循application覆盖bootstrap原则,同样此时变成了低优先级覆盖高优先级。

注意:如bootstrap中配置spring.profiles.active: dev,并在application中配置spring.profiles.active: test,此时读取的bootstrap-{profile}.properties/ymlapplication-{profile}.properties/yml中参数{profile}devapplication中配置未生效。

三、application配置文件加载顺序

通常情况下,Spring Boot 在启动时会将 resources 目录下的 application.propertiesapllication.yml 作为其默认配置文件,我们可以在该配置文件中对项目进行配置,但这并不意味着 Spring Boot 项目中只能存在一个 application.propertiesapplication.ymlSpring Boot 项目中可以存在多个 application.propertiesapllication.yml

在这里插入图片描述

上图中的节点说明如下:

  • /myBoot:表示 JAR 包所在目录,目录名称自定义;
  • /childDir:表示 JAR 包所在目录下 config 目录的子目录,目录名自定义;
  • JAR:表示 Spring Boot 项目打包生成的 JAR;
  • 其余带有“/”标识的目录的目录名称均不能修改。
  • 红色数字:表示该配置文件的优先级,数字越小优先级越高。

这些配置文件得优先级顺序,遵循以下规则:

  • 先加载 JAR 包外的配置文件,再加载 JAR 包内的配置文件;
  • 先加载 config 目录内的配置文件,再加载 config 目录外的配置文件;
  • 先加载 config 子目录下的配置文件,再加载 config 目录下的配置文件;
  • 先加载 appliction-{profile}.properties/yml,再加载 application.properties/yml;
  • 先加载 .properties 文件,再加载 .yml 文件

四、Spring Boot常用外部配置加载方式

以下是常用的 Spring Boot 配置形式及其加载顺序(优先级由高到低):

  • 命令行参数

所有的配置都可以在命令行上进行指定:

 java -jar {Jar文件名} --{参数1}={参数值1} --{参数2}={参数值2}

例如,可以通过指定 --spring.config.location来改变默认的配置文件位置,通过指定 --spring.profiles.active激活环境:

java -jar properties-0.0.1-SNAPSHOT.jar --spring.config.location=classpath:./ --spring.profiles.active=test
  • Java 系统属性(System.getProperties())

例如,可以通过指定 -Dspring.profiles.active激活环境:

java -jar properties-0.0.1-SNAPSHOT.jar -Dspring.profiles.active=test
  • 操作系统环境变量

  • jar包外部的application-{profile}.propertiesapplication-{profile}.yml(带spring.profile)配置文件。

  • jar包内部的application-{profile}.propertiesapplication-{profile}.yml(带spring.profile)配置文件。

  • jar包外部的application.propertiesapplication.yml(不带spring.profile)配置文件。

  • jar包内部的application.propertiesapplication.yml(不带spring.profile)配置文件。

  • @Configuration 注解类上的 @PropertySource 指定的配置文件

  • 通过 SpringApplication.setDefaultProperties 指定的默认属性

以上所有形式的配置都会被加载,当存在相同配置内容时,高优先级的配置会覆盖低优先级的配置;存在不同的配置内容时,高优先级和低优先级的配置内容取并集,共同生效,形成互补配置,大体顺序如下:program arguments > VM options > Enviroment variables > properties文件 > yml文件。

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

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

相关文章

CHAPTER 3 Web HA集群部署 - Keepalived

Web HA集群部署 - Keepalived1. Keepalived概述1.1 工作原理1.2 核心功能1.3 拓扑图2. KeepAlived安装方式2.1 yum源安装2.2 源码包编译3. KeepAlived安装3.1 环境依赖3.2 安装nginx3.3 安装Keepalived4. Keepalived部署4.1 主备模式1. 节点配置2. 主节点配置文件3. 从节点配置…

金三银四了,准备跳槽的可以看看....

前两天跟朋友感慨,去年的铜九铁十、裁员、疫情导致好多人都没拿到offer!现在已经3月了,具体的金三银四也已经到来了。 对于想跳槽的职场人来说,绝对要已经提前做准备了。这时候,很多高薪技术岗、管理岗的缺口和市场需求也出来了。…

谷粒学苑第七 八 九天

谷粒学苑第七天 上传到服务器 文件上传到接口中 在接口中读取内容 加到数据库 swagger: 报了实体类的错:刚刚这里忘记写数据了 一级二级都查出来了: 课程发布流程确认 报错: 实体类全部改为_STR还是报错 org.springfr…

Java线程池源码分析

Java 线程池的使用,是面试必问的。下面我们来从使用到源码整理一下。 1、构造线程池 通过Executors来构造线程池 1、构造一个固定线程数目的线程池,配置的corePoolSize与maximumPoolSize大小相同, 同时使用了一个无界LinkedBlockingQueue存…

《PyTorch深度学习实践10》——循环神经网络-基础篇(Basic-Recurrent Neural Network)

目录一、RNN简介二、RNN Cell用法三、RNN用法三、实例:hello换序1.RNN Cell2.RNN四、Embedding一、RNN简介 RNN网络最大的特点就是可以处理序列特征,就是我们的一组动态特征。比如,我们可以通过将前三天每天的特征(是否下雨&#…

七、SpringBoot_自动装配

自动装配 官方文档 SpringBoot自动配置尝试根据您添加的 jar 依赖项自动配置您的 Spring 应用程序 Spring Boot auto-configuration attempts to automatically configure your Spring application based on the jar dependencies that you have added. SpringBoot定义了一套接…

详谈IIC

前言 在嵌入式底层系统中,常见的通讯方式,串口,IIC,SPI,IIS等,一般IIC,SPI,IIS更多的采取IO模拟,其余CAN,UART均是硬件设计直接支持,而IIC主要用于多数传感器数据的读写&#xff0c…

【c++基础】

C基础入门统一初始化输入输出输入输出符输入字符串const与指针c和c中const的区别const与指针的关系常变量与指针同类型指针赋值的兼容规则引用引用的特点const引用作为形参替换指针其他引用形式引用和指针的区别inline函数缺省参数函数重载判断函数重载的规则名字粉碎C编译时函…

Goby 征文大擂台,超值盲盒等你来!

001 Goby 技术征文正式启动 Goby 致力于做最好的网络安全工具。为了促进师傅们知识共享和技术交流,现发起关于 Goby 的技术文章征集活动! 欢迎所有师傅们参加,分享您的使用经验或挖洞窍门等,帮助其他人更好地了解和利用 Goby。 …

Winform界面实现控件中英文语言切换

一、业务需求 在Winform项目的开发过程中,涉及到一个基础的功能就是需要对界面中的显示语言内容可以进行选择切换,方便不同地区的使用者快速上手使用;效果如下: 二、需求分析 需要实现对Winform项目界面显示语言可选择切换步骤如下: ①修改控件的显示内容; ②获取到界面显…

【计算机网络】数据链路层

概述 封装成帧 差错检验 可靠传输 实现机制 可靠传输的实现机制 停止等待协议 回退N帧协议 选择重传协议 【计算机网络】MAC帧和PPP帧(定义使用范围区别共同点)_GPNU_Log的博客-CSDN博客_ppp帧 PPP帧和以太网帧 | Mixoo 数据链路层的协议有PPP协…

Rman单实例迁移到单实例

关于同平台同版本数据库之间的迁移操作的实验 ---Source DB[rootoracle-db-19cs ~]# cat /etc/redhat-release CentOS Stream release 8 [rootoracle-db-19cs ~]# --- Target DB[rootoracle-db-19ct ~]# cat /etc/redhat-release CentOS Stream release 8 [rootoracle-db-19ct…

如何使用dlinject将一个代码库实时注入到Linux进程中

关于dlinject dlinject是一款针对Linux进程安全的注入测试工具,在该工具的帮助下,广大研究人员可以在不使用ptrace的情况下,轻松向正在运行的Linux进程中注入一个共享代码库(比如说任意代码)。之所以开发该工具&#…

扬帆优配|新概念火了!时空大数据龙头再冲击涨停

时空大数据近期受资金追捧。 今天早盘,中通邦本开盘后再度冲击涨停,一度封死涨停板,之后涨停打开,截至上午收盘仍上涨超5%。此前,中通邦本已接连两日涨停,公司在互动渠道上表示,参股公司北京邦本…

Spring中Bean生命周期及循环依赖

spring中所说的bean对象 与 我们自己new的对象(原始对象)是不同的;bean对象是指spring框架创建管理的我们的对象生命周期即:何时生,何时死1.实例化 Instantiation:spring通过反射机制以及工厂创建出来的原始对象;2.属性…

【Spring】八种常见Bean加载方式

🚩本文已收录至专栏:Spring家族学习 一.引入 (1) 概述 ​ 关于bean的加载方式,spring提供了各种各样的形式。因为spring管理bean整体上来说就是由spring维护对象的生命周期,所以bean的加载可以从大的方面划分成2种形式&#xff…

2023年融资融券研究报告

第一章 行业概况 融资融券是证券交易市场上的两种金融衍生品交易方式,主要用于股票、债券等证券的融资和投资。 融资是指投资者向证券公司借入资金购买证券,以期望股票价格上涨后卖出获得利润。融资需支付一定的利息和费用,利息根据借入的资…

CSS实现checkbox选中动画

前言 👏CSS实现checkbox选中动画,速速来Get吧~ 🥇文末分享源代码。记得点赞关注收藏! 1.实现效果 2.实现步骤 定义css变量,–checked,表示激活选中色值 :root {--checked: orange; }创建父容器&#xf…

python+pytest接口自动化(6)-请求参数格式的确定

我们在做接口测试之前,先需要根据接口文档或抓包接口数据,搞清楚被测接口的详细内容,其中就包含请求参数的编码格式,从而使用对应的参数格式发送请求。例如某个接口规定的请求主体的编码方式为 application/json,那么在…

Go 实现 AOI 区域视野管理

在游戏中,场景里存在大量的物体.如果我们把所有物体的变化都广播给玩家.那客户端很难承受这么大的压力.因此我们肯定会做优化.把不必要的信息过滤掉.如只关心玩家视野所看到的.减轻客户端的压力,给玩家更流畅的体验. 优化的思路一般是: 第一个是尽量降低向客户端同步对象的数量…