前言

大部分情况下,我们开发的产品应用都会根据不同的目的,支持运行在不同的环境(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. 浅议NetMQ常见模式和消息加密机制

    浅议NetMQ常见模式和消息加密机制 概述 在传统企业级开发中,消息队列机制已经成为一种非常常见的技术实现手段,而基于NetMQ则看起来有点像一朵"奇葩",看起来从名字似乎是一个消 ...

  2. 关于ENSP错误代码的常见问题

    1.最适合ensp运行的环境是win7,在win7上运行基本不会出什么大问题(ensp370+virtualbox4.2.8) 2.如果需要重新安装,最好把旧版本清除干净,ensp+virtualbo ...

  3. java核心技术 第3章 java基本程序设计结构

    类名规范:以大写字母开头的名词 若由多个单词组成 每个单词的第一个字母应大写(驼峰命名法)  与.java文件名相同 运行程序:java ClassName(dos命令) 打印语句:System.ou ...

  4. ZooKeeper 集群搭建 Error contacting service. It is probably not running.

    搭建环境:Centos 7 虚拟机 3台 按照此教程搭建:https://www.ilanni.com/?p=11393 之后出现错误:Error contacting service. It is ...

  5. SimpleNVR流媒体服务在多分屏直播实时阅览时所遇到问题的解决

    视频有一个流的概念,称为流媒体.当大量的客户端或WEB访问监控摄像机的时候,大多数的录像机无法承受那么大的网络压力,这时候SimpleNVR流媒体服务器的优势就显示出来了.其能将客户端的访问压力转到服 ...

  6. PyCharm Django Python 开发环境配置 详细教程

    PyCharm Django Python 开发环境配置 详细教程 1. Python 下载及安装 (1)根据需要的版本去 Python 官网(https://www.python.org/downl ...

  7. JMeter跨线程组保持登录(多线程组共享cookie)

    使用__setProperty设置全局变量: 1.jmeter中创建一个登录请求,然后执行,察看结果树-->查看返回cookie信息,我的是在Response data中的 Response h ...

  8. 7-7 后缀式求值 (25分)的python实现

    exp=input().split() ls=list() def Cal(a,b,i): if i=="+": return a+b elif i=="-": ...

  9. SpringCloud升级之路2020.0.x版-34.验证重试配置正确性(2)

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们继续上一节针对我们的重试进行测试 验证针对限流器异常的重试正确 通过系列前面的源码分析 ...

  10. RabbitMQ Network Partitions 处理策略

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 网络分区的意义 RabbitMQ的模型 ...