前言

大部分情况下,我们开发的产品应用都会根据不同的目的,支持运行在不同的环境(Profile)下,比如:

  • 开发环境(dev)
  • 测试环境(test)
  • 预览环境(pre)
  • 生产环境(prod)

这里的 环境 实际上是一个统称,不同的环境可能代表着

  • 使用的域名、端口、实例数目是不同的;
  • 连接的数据库地址、端口、名称是不同的;
  • 使用的日志输出格式、级别、保存时间是不同的;

以数据库为例,应用在开发环境下运行时,连接的是开发环境对应的数据库;应用在生产环境下运行时,连接的是生产环境对应的数据库。

我们不是要为不同的运行环境开发多个不同的应用,而是要使应用可以运行在多个不同的环境中,怎么做到?

通过配置,更准备地说,是通过配置属性。配置属性本质就是键值对。

以数据库为例,应用连接数据库时,需要提供如下连接信息:

  • 地址
  • 端口
  • 名称
  • 用户名
  • 密码

这些信息不会 硬编码 到应用代码中,而是以配置属性(键值对)的形式存储到配置文件中;应用运行时通过读取该配置文件中的配置属性,进而完成数据库的连接。

应用 = 程序代码 + 配置文件

这个配置文件中连接信息指向测试使用的数据库,我们就说应用运行在测试环境;连接信息指向生产使用的数据库,我们就说应用运行在生产环境;应用需要使用的其它服务(如:Redis、Kafka等)也是同样的原理。

也说是说,我们可以通过为应用运行时指定不同的配置文件(不同的配置文件配置着不同的配置属性),就可以使得应用可以运行在不同的环境中。SpringBoot 实际上也是通过类似的原理实现多环境的配置及切换的。

:配置属性可能有多种存储方式,这里仅以配置文件为例。

默认环境配置

多环境配置及切换并不是每个应用所必须的,SpringBoot 也为我们考虑到了这一点,它提供了默认的配置文件和运行环境,即:如果没有特别指定,SpringBoot 使用默认的配置文件,运行于默认环境中。

默认配置文件

SpringBoot 默认配置文件:application.yml,默认位于类路径下。其中,application 代表 SpringBoot 配置文件名称,yml 代表配置文件格式(后缀)。

默认配置文件实际也可以不提供,或者内容为空。这是为什么呢?

SpringBoot 是一个功能十分丰富的技术框架,自身内置了很多的配置属性,用以控制 Spring 容器的初始化行为;同时,SpringBoot 也支持通过外置配置文件的方式引入其它的配置属性,application.yml 就是会被 SpringBoot 默认加载的外置配置文件之一。

SpringBoot 配置属性 = 内置配置属性 + 外置配置文件属性(application.yml)

如果 application.yml 不存在或者内容为空,SpringBoot 仅使用内置配置属性初始化容器环境;如果 application.yml 存在且内容不为空,SpringBoot 使用内置配置属性和 application.yml 配置属性的合集初始化容器环境。

如果 application.yml 中的配置属性名称和内置属性相同,那么这个配置属性值最终以 application.yml 中的配置值为准(覆盖)。相当于,application.yml 的配置文件属性优先级高于默认的内置属性。

:SpringBoot 也支持 properties 后缀的配置文件格式,本文以 yml 为例。

默认运行环境

SpringBoot 默认运行环境:default,default 为运行环境名称。

默认运行环境的名称是哪里来的呢?

如前文所述,SpringBoot 是有内置属性的,默认的运行环境名称即来自于内置属性:

spring.profiles.active=default

也就是说,内置配置属性 spring.profiles.active 指定 SpringBoot 的运行环境名称为 default,我们可以将其指定为其它值,进行改变运行环境名称。

多环境配置

因为 application.yml 配置属性的优先级高于默认的内置属性,我们可以通过在 application.yml 中指定配置属性 spring.profiles.active 的值为 dev,将 SpringBoot 运行环境的名称修改为 dev:

application.yml

spring:
profiles:
active: dev

仅仅是修改运行环境名称么?SpringBoot 帮我们做的还有更多,它会自动搜索名称为 application-dev.yml 的配置文件并加载其中的配置属性。

配置文件名称是有固定模式的:

application-{profile}.yml

其中,{profile} 为我们通过配置属性 spring.profiles.active 指定的运行环境名称。

也就是说,如果我们指定运行环境名称为 dev,SpringBoot 会为我们自动搜索加载配置文件名称为 application-dev.yml 中的配置属性;如果我们指定运行环境名称为 test,SpringBoot 会为我们自动搜索加载配置文件名称为 application-test.yml 中的配置属性;其它运行环境名称同理。

SpringBoot 配置属性 = 内置属性 + application.yml 配置属性 + application-{profile}.yml 配置属性

SpringBoot 配置属性优先级:application-{profile}.yml 配置属性 > application.yml 配置属性 > 内置属性

也就是说,我们可以通过指定不同的运行环境名称,以及相应名称的配置文件,从而实现多环境之间的切换。

:如果找不到相应环境(profile)的配置文件,则会忽略。

多环境切换

以开发环境(dev)、测试环境(test)、预览环境(pre)、生产环境(prod)为例,我们可以预先在项目中创建相应环境的配置文件:

application-dev.yml
application-test.yml
application-pre.yml
application-prod.yml

每一个环境的配置文件中配置相应环境对应的属性,如:数据库连接信息等;然后在 application.yml 中通过指定配置属性 spring.profiles.active 为不同的值实现多环境切换,如:

spring:
profiles:
active: prod

代表 SpringBoot 的运行环境名称为 prod,它将会加载 application-prod.yml 中的配置属性。

还可以在 SpringBoot 启动时,通过命令行参数的方式指定配置属性:

java -jar myproject.jar --spring.profiles.active=prod

SpringBoot 配置属性优先级:命令行参数配置属性 > application-{profile}.yml 配置属性 > application.yml 配置属性 > 内置属性

推荐的方式是通过 application.yml/spring.profiles.active 指定 SpringBoot 应用默认的运行环境,应用启动时通过命令行参数指定具体的运行环境;如果启用启动时没有指定,则应用使用默认的运行环境运行。

小结

SpringBoot 多环境配置及切换,本质就是通过预先设定好多个运行环境名称及相应的配置文件;应用启动时通过指定运行环境名称,进而加载对应名称的配置文件实现的。

实际使用时,我们还可以充分利用配置属性加载的优先级合理地规划应用的配置属性,比如:

  1. 通用配置(与运行环境无关的)属性可以放到 application.yml 中;
  2. 运行环境(profile)相关的配置属性可以放到相应的 application-{profile}.yml 中;
  3. 启动时需要临时指定的配置属性可以通过命令行参数设置;
  4. 2 和 3 中配置属性也可以放到 application.yml 中一份,作为默认配置。

SpringBoot Profiles 多环境配置及切换的更多相关文章

  1. maven profiles多环境配置

    maven profiles多环境配置 转载. https://blog.csdn.net/runbat/article/details/81747874 今天做了一个小项目,需要配置开发.测试.预发 ...

  2. SpringBoot实现多环境配置

    1.为什么需要配置多环境配置 在实际的开发中,我们往往需要在不同的环境中使用不同的数据库.缓存配置,如果使用同一套配置文件,在不同环境部署的时候手动去修改配置文件,会使部署变得很繁琐.使用多环境配置文 ...

  3. Maven之profile实现多环境配置动态切换

            一般的软件项目,在开发.测试及生产等环境下配置文件中参数是不同的.传统的做法是在项目部署的时候,手动修改或者替换这个配置文件.这样太麻烦了,我们可以用Maven的profile来解决这 ...

  4. Spring boot 的profile功能如何实现多环境配置自动切换

    通常服务端应用开发需要经过以下几个流程: 开发 -> 测试 -> RC验证 -> 上线 这就涉及到四个不同的环境,开发环境.测试环境.RC环境以及生产环境,为了避免不同环境之间相互干 ...

  5. (十一)Maven之profile实现多环境配置动态切换

    原文链接:https://www.cnblogs.com/zeng1994/p/a442108012ffd6a97b22c63055b48fe9.html 一.多环境配置文件的放置  将不同环境下的配 ...

  6. Springboot 实现多环境配置

    多环境配置 我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发.测试.生产等.其中每个环境的数据库地址.服务器端口等等配置都会不同,如果在为不同环境打包时 ...

  7. 从源码研究如何不重启Springboot项目实现redis配置动态切换

    上一篇Websocket的续篇暂时还没有动手写,这篇算是插播吧.今天讲讲不重启项目动态切换redis服务. 背景 多个项目或微服务场景下,各个项目都需要配置redis数据源.但是,每当运维搞事时(修改 ...

  8. springboot打包不同环境配置与shell脚本部署

    本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作: profiles指定不同环境的配置 maven-assembly-plu ...

  9. 转 通过 spring 容器内建的 profile 功能实现开发环境、测试环境、生产环境配置自动切换

                                      软件开发的一般流程为工程师开发 -> 测试 -> 上线,因此就涉及到三个不同的环境,开发环境.测试环境以及生产环境,通常 ...

随机推荐

  1. hdu 1171 Big Event in HDU(背包DP)

    题意: 杭电搬迁,有N种设备,每种设备有个价值V,数量M,要求将这些设备平分,使得平分后两边的总价值尽可能地相等. 输出两边各自的总价值. 思路: 背包DP后,P=所有的总价值/2,然后从P开始往两边 ...

  2. linux 内核源代码情景分析——linux 内存管理的基本框架

    386 CPU中的页式存管的基本思路是:通过页面目录和页面表分两个层次实现从线性地址到物理地址的映射.这种映射模式在大多数情况下可以节省页面表所占用的空间.因为大多数进程不会用到整个虚存空间,在虚存空 ...

  3. Android Jetpack Compose 引入示例工程

    引入 Jetpack Compose 示例工程 去GitHub上找到Compose的示例工程 https://github.com/android/compose-samples ,clone到本地 ...

  4. Element - 日期禁用集合(持续更新)

    当前日期之前的日期禁用 <el-date-picker v-model="form.startTime" type="date" placeholder= ...

  5. CSS学习(三)特指度和层叠

    一.特指度 特制度的一般形式是0,0,0,0 行内样式,第一位的特指度加一 id选择符,第二位的特指度加一 类选择符.属性选择符.伪类,第三位的特指度加一 元素选择符.伪元素,第四位的特指度加一 特指 ...

  6. split,cdn,shell脚本,tmux,记一次往国外服务器传大文件的经历

    需求是这样的:将一个大概680M的Matlab数据文件传到国外某所大学的服务器上,服务器需要连接VPN才能访问,由于数据文件太大,而且如果我直接ssh连过去或者用ftp传输,那么中间很可能中断. ps ...

  7. Linux ns 3. Mnt Namespace 详解

    1. 文件系统层次化 对 Linux 系统来说一切皆文件,Linux 使用树形的层次化结构来管理所有的文件对象. 完整的Linux文件系统,是由多种设备.多种文件系统组成的一个混合的树形结构.我们首先 ...

  8. Springboot+Mybatisplus替换mybatis整合报错Mapped Statements collection does not contain value

    问题一: mybatisPlus完全兼容mybatis,一般来说直接替换掉就可以了,如果mybatis的数据源不能取消创建的话,就注掉mybatisplus的数据源 //@Configurationp ...

  9. JS表格显示时间格式

    <!-- JS代码区 --> <script type='text/javascript'> $(function() { var grid_selector23 = &quo ...

  10. .net工程师学习vue的心路历程(二)

    本章主要搞懂在通过vue init webpack projectname 命令创建 vue 项目过程中有个选择.即关于如何选择:runtime+compiler和runtime+only. 现在我通 ...