优雅哥 SpringBoot 2.7.2 实战基础 - 06 -多环境配置

在一个项目的开发过程中,通常伴随着多套环境:本地环境 local、开发环境 dev、集成测试环境 test、用户接受测试环境 uat、预生产环境 pre、生产环境 prod。本节的内容有些脱离真实企业开发,因为在真实的企业开发中,不会只开发一个独立的服务,而是多个微服务。发展至今,云原生也越来越普遍。面对多套环境,通常是”一套代码 + 配置中心“的方式,将代码编译打包后,在启动服务时或服务运行过程中,从配置中心读取配置,保证各个环境代码完全一致,仅配置不同。关于配置中心,在后面的系列文章中会详细介绍。

1 配置文件

1.1 配置文件优先级

在第一篇文章中就谈到,Spring Boot 默认核心配置文件名为 application,支持 application.propertiesapplication.ymlapplication.yaml。后面两个本质上同一种类型。当三者同时存在时,优先级为:properties > yaml > yml。也就是说,当某个配置项在几者中都存在时,该配置项的值就使用 application.properties 中的值。

此外,配置文件的优先级与目录有关。通常情况下,我们都把核心配置文件放在 src/main/resources 下,本质上是在类路径下(编译后 src/main/resources 下的文件会编译到 target/classes/下面)。如果放到 config目录下(如: src/main/resources/config/application.yml),config目录下的核心配置文件优先级会更高。

官方文档中还提到核心配置文件放在项目根路径等情景,在项目中到目前为止都没碰到过,这里就不提了。

最后说明一点,优先级最最高的,是在启动命令行后面的参数。如 server.port,无论在配置文件中配置什么,只要在启动命令后面配置了该参数,就使用该参数的值:

java -jar hero-springboot-demo.jar --server.port=9099

1.2 bootstrap.yml

也许在很多代码里会看到 bootstrap.yml文件,有些文章说 bootstrap.yml 的优先级最高。这种说法是不完全准确的!

bootstrap.yml 文件在纯粹的 Spring Boot 应用中不会生效,它只有在 Spring Cloud 下才会生效,在 Spring Cloud 中,应用会直接或间接依赖 spring-cloud-context,此时才会读取 bootstrap.yml 文件和 application.yml 文件,这种情况下 bootstrap.yml 优先级高于其他核心配置文件。

1.3 准备配置文件

为多个环境准备不同的配置文件,这里模拟三个环境:本地环境 local、开发环境 dev、测试环境 test。在 src/main/resources 目录下复制 application.yml 到当前目录,分别重命名为 application-local.ymlapplication-dev.ymlapplication-test.yml。端口号 server.port 分别修改为 9099、9091、9092。

src/main/resources/
|- application.yml
|- application-local.yml 9099
|- application-dev.yml 9091
|- application-test.yml 9092
|- ....

上面复制的三个文件命名方式都是:application-{环境名称},按照这种方式命名,就不需要分别在每个环境的配置文件中使用 spring.profiles 来设置名字了。application.yml为主文件。

2 多环境两种配置方式

2.1 spring.profiles.active

这种方式可以通过设置 spring.profiles.active 的值来指定使用的环境配置文件。修改 application.yml ,删除里面的全部内容,添加 profile 配置,如下:

spring:
profiles:
active: local

上面的配置指定了环境为 local,会加载 application-local.yml 文件。

同样的,可以将 local修改为devtest,分别对应 application-dev.ymlapplication-test.yml

此外,在打包后,也可以在运行 jar 包时指定生效的环境:

java -jar hero-springboot-demo.jar --spring.profiles.active=test

由于启动参数中指定了 test,无论 application.yml 中配置什么,都会被命令行参数 test 覆盖,读取 application-test.yml 的配置。

2.2 Maven

除了上面手动修改 spring.profiles.active 的方式,还可以通过 Maven打包实现。

application.ymlspring.profiles.active 配置一个占位符,在 Maven 打包时,通过具体的 profile,替换 application.yml 中的占位符。具体实现如下:

1)application.yml 中使用占位符

spring:
profiles:
active: @env@

2)pom.xml 中配置多环境

首先配置 profile:

<profiles>
<profile>
<id>local</id>
<properties>
<env>local</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
</profiles>

上面配置了三套 profile,env的值分别定义为 local、dev、test,且 local 为默认激活。 接着在 <build> 中添加资源的处理:

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>application-*.yml</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application.yml</include>
<include>application-${env}*.yml</include>
</includes>
</resource>
</resources>
<plugins>
...
</plugins>
</build>

filtering设置为 true,表示利用占位符进行替换。上面的配置先排除 application- 开头的资源文件,然后在根据生效的profile 对应的 env的值,打包对应的 application-xxx.yml 文件。

现在启动服务,正常加载使用 application-local.yml,端口号为 9099。

接下来测试打包。打包有两种方式:使用命令行和IDEA。

命令行:

mvn clean package -Pdev

-P后面就是对应的环境。

使用图形界面,需要先选择profile,如下图所示:

两种方式打包后都会在 target 目录下生成 hero-springboot-demo.jar,可以在命令行中启动,查看加载的环境配置文件和运行的端口号:

java -jar target/hero-springboot-demo-1.0-SNAPSHOT.jar



今日程序员优雅哥(\/ youyacoder)学习到此结束~~~

多环境配置 - SpringBoot 2.7.2 实战基础的更多相关文章

  1. 清晰梳理最全日志框架关系与日志配置-SpringBoot 2.7.2 实战基础

    优雅哥 SpringBoot 2.7.2 实战基础 - 07 - 日志配置 Java 中日志相关的 jar 包非常多,log4j.log4j2.commons-logging.logback.slf4 ...

  2. 使用 Liquibase 管理数据库版本 - SpringBoot 2.7 .2 实战基础

    优雅哥 SpringBoot 2.7 .2 实战基础 - 05 -使用 Liquibase 管理数据库版本 在企业开发中,数据库版本管理好像是一个伪命题,大多项目都是通过 Power Designer ...

  3. 集成 Redis & 异步任务 - SpringBoot 2.7 .2实战基础

    SpringBoot 2.7 .2实战基础 - 09 - 集成 Redis & 异步任务 1 集成Redis <docker 安装 MySQL 和 Redis>一文已介绍如何在 D ...

  4. SpringBoot 如何集成 MyBatisPlus - SpringBoot 2.7.2实战基础

    SpringBoot 2.7.2 学习系列,本节通过实战内容讲解如何集成 MyBatisPlus 本文在前文的基础上集成 MyBatisPlus,并创建数据库表,实现一个实体简单的 CRUD 接口. ...

  5. SpringBoot | 第五章:多环境配置

    前言 写上一篇看英文资料,耗费了心力呀,这章,相对来说简单点.也比较熟悉,但是这很实用.不扯了,开始~ 多环境配置 maven的多环境配置 springboot多环境配置 总结 老生常谈 多环境配置 ...

  6. SpringBoot学习<二>——SpringBoot的默认配置文件application和多环境配置

    一.SpringBoot的默认文件appliction 上一篇文章已经说明,springboot启动会内嵌tomcat,端口也是默认的8080,如果我们想要改变端口如果做呢? 在springboot项 ...

  7. Java应用在docker环境配置容器健康检查

    在<极速体验docker容器健康>一文已体验了docker容器健康检查功能,今天就来给java应用的容器加入健康检查,使应用的状态随时都可以被监控和查看. 实战环境信息 操作系统:macO ...

  8. Android 服务端开发之开发环境配置

    Android 服务端开发之开发环境配置 这里是在Eclipse的基础上安装PhpEclipse插件方法,PHPEclipse是Eclipse的 一个用于开发PHP的插件.当然也可以采用Java开发a ...

  9. GPU编程自学2 —— CUDA环境配置

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题.这里主要记录自己的GPU自学历程. 目录 <GPU编程自学1 -- 引言> <GPU编程自学2 -- CUD ...

随机推荐

  1. Es6语法+v-on参数相关+vue虚拟dom

    Es6的语法 Es5:if和for 都没有块级作用域,函数function有作用域. Es6:加入let使得if和for有作用域 .建议: 在Es6中优先使用const,只有需要改变某一个标识符的时候 ...

  2. Dubbo3 源码系列 -- 环境准备

    Dubbo3 源码系列 -- 环境准备 前言 工作中一直使用Dubbo项目,借着这次机会通过源码的方式来学习下Dubbo的源码内容.目前市面上很多都是的Dubbo2系列的教程:就连目前的Dubbo的官 ...

  3. swap函数模板

    在许多应用程序中,都有交换相同类型的两个变量内容的需要.例如,在对整数数组进行排序时,将需要一个函数来交换两个变量的值,如下所示: void swap(int &a, int &b) ...

  4. 2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP详细版

    2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP 题目描述 蓝桥学院由21栋教学楼组成,教学楼编号1到21.对于两栋教学楼a和b,当a和b互质时,a和b之间有一条走廊直接相连,两个方向皆可通 ...

  5. .NET中如何在同步代码块中调用异步方法

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月2日. 在同步代码块中调用异步方法,方法有很多. 一.对于有返回值的Task 在同步代码块中直接访问 Task 的 Result ...

  6. Weakmap详解

    先看一个例子 let obj = { name: 'toto' } // { name: 'toto' }这个对象能够被读取到,因为obj这个变量名有对它的引用 // 将引用覆盖掉 obj = nul ...

  7. Linux文本三剑客-grep

    Global search REgular expression and Print out the line 全局搜索正则表达式并打印行 作用: 对标准输入的行进行分析,过滤指定的行. 模式: 格式 ...

  8. Tapdata肖贝贝:实时数据引擎系列(三) - 流处理引擎对比

      摘要:本文将选取市面上一些流计算框架包括 Flink .Spark .Hazelcast,从场景需求出发,在核心功能.资源与性能.用户体验.框架完整性.维护性等方面展开分析和测评,剖析实时数据框架 ...

  9. ooday08 Java_多态_向下强制转型

    笔记: 多态: 表现: 同一个对象被造型为不同的类型时,有不同的功能 --对象的多态:我.你.水......------所有对象都是多态的(明天体会) 同一类型的引用指向不同的对象时,有不同的实现 - ...

  10. AtCoder Beginner Contest 260 G // imos(累积和算法)

    题目传送门:G - Scalene Triangle Area (atcoder.jp) 题意: 给定大小为N*N的OX矩阵,若矩阵的(s,t)处为O,其覆盖范围为:满足以下条件的所有位置(i,j) ...