SpringBoot 环境变量

3 阅读5分钟

前言

控制程序行为的方式很多,通过变量控制是最常见的方式之一,而变量的使用方式也很多,以 SpringBoot 为例,我们可以通过 yml、JVM 参数、命令行参数、系统参数等多种手段,指定某些特殊变量,使其在程序运行时生效。

看看常见的 IDEA 变量配置:

image.png

本文将以 SpringBoot 为例,讲解实战中如何设置环境变量。

变量

yml/properties 配置文件

这种文件在 Spring 应该中最为常见,我们应用程序的主要配置参数都设置在这类文件中。

yml(yaml) 文件 和 properties 文件格式都支持,二者选其一即可,我们以 yml 文件为例:

spring 默认约定使用 application 作为文件名(前缀),即 application.yml,多环境定义格式:application-{环境}.yml,如:

  • 开发:application-dev.yml
  • 测试:application-test.yml
  • 生产:application-prod.yml

我们在启动时,指定激活对应的环境即可,如:

image.png

项目实战配置格式:

image.png

可以看到,除了对应环境的 yml 配置,还存在 bootstrap.yml 和 application.yml 文件,具体有什么区别?

  • bootstrap.yml:主要用于系统启动的时候加载的一些配置信息。比如,使用 Apollo 配置中心的时候,就可以在这个文件中指定 Apollo Server 的地址。
  • application.yml:是 Spring Boot 的主配置文件,定义通用属性(提炼抽取变量)
  • application-{profile}.yml:特定环境下的配置,可以通过 spring.profiles.active={profile} 进行激活配置。

如果都定义了相同属性怎么选择?

如果你在 bootstrap.yml、application.yml 和 application-{profile}.yml 中定义了相同的属性,那么:

  • application-{profile}.yml 中的属性值会覆盖 application.yml 中的属性值,
  • application.yml 中的属性值会覆盖 bootstrap.yml 中的属性值。

JVM 参数

通常在启动程序时,指定的特殊值(系统属性),比如指定配置文件地址、应用程序名称等,以 -D 开头:

image.png

当然,在服务器环境,运维通常还要指定 jvm 运行参数,以 -X 开头:

  • -Xms:设置初始Java堆大小。例如,-Xms64m表示初始堆大小为64MB。
  • -Xmx:设置最大Java堆大小。例如,-Xmx256m表示最大堆大小为256MB。
  • ...

-D和-X分别表示什么?

在 Java 的 VM options 中,-D-X 参数有不同的含义:

  1. -D:这是设置系统属性的参数。例如,-Dfile.encoding=UTF-8 设置文件编码为 UTF-8。然后可以在程序中通过 System.getProperty("file.encoding") 来获取这个属性。
  2. -X:主要用于控制 JVM 的运行环境,例如内存大小、垃圾回收等。例如,-Xms64m 设置 JVM 的初始堆内存为 64MB,-Xmx256m 设置 JVM 的最大堆内存为 256MB。

简言之,-D主要是用来设置系统属性,而-X主要是用来设置JVM的运行环境。

Environment variables

操作系统环境变量,在实际场景中,我们可以用它来指定数据文件路径、服务启动端口号、激活文件等,如:

image.png

总的来说,该变量是操作系统中用来指定运行环境的一些参数,主要作用:

  1. 配置信息:环境变量常常用于存储系统配置信息,如数据库连接字符串、文件路径等。这样,应用程序可以在运行时读取这些信息,而无需在代码中硬编码。
  2. 影响程序行为:某些环境变量可以改变程序的行为。例如,JAVA_HOME 环境变量指定了 Java 安装的位置,PATH 环境变量指定了系统查找可执行文件的目录。
  3. 区分环境:在不同的运行环境(dev、test、prod)中,可以选择激活不同的环境文件
  4. 安全:环境变量常用于存储敏感信息,如密码、密钥等。这样,这些信息就不会出现在代码或配置文件中,可以提高安全性。

在 Java 中,可以通过 System.getenv() 方法来获取环境变量。

Program arguments

设置应用程序的命令行参数,这些参数会被传递给你的应用程序的 main 方法。

在 idea 设置方式:

image.png

也可以在 java 启动时指定,如:

java Main arg1 arg2 arg3

生效顺序

笔者在实战中常用的方式有:yml/properties、JVM 参数、Environment,三者的常见用途是:

  1. yml/properties文件:主要用于业务参数变量配置,分为 bootstrap.yml、application.yml、application-{环境}.yml
  2. JVM 参数:本地启动时指定 yml/properties 文件路径、服务名称(服务启动后后会注册到测试环境的注册中心,所以要重新命名)、以及 kafka消费组等参数
  3. Environment:指定服务启动端口、profile 文件激活等。

既然有这样的方式定义参数,就有可能重复定义,那 Spring 在加载的时候生效的顺序是?

  1. 命令行参数:在Java中,当启动一个程序时,可以在命令行中指定参数,这些参数会被传递给程序的 main 方法,如:java Main arg1 arg2 arg3
  2. Java 系统属性(System.getProperties()),以-D开头,如 java -DmyKey=myValue MyProgram,启动名为 "MyProgram" 的java程序,并设置一个名为 "myKey" 的系统属性
  3. 操作系统环境变量,通过 IDEA 中 Environment Variables设置。
  4. 配置文件:application-{profile}.properties 或 application.yml
  5. 配置文件:application.properties 或 application.yml
  6. 配置文件:bootstrap.yml

以上便是常见的 SpringBoot 变量设置方式,如果你还有其他方式,欢迎补充!