Profile多環境下Profile
在實際項目發佈流程中,往往會涉及到多個環境下各類配置的切換。在Spring Boot中提供了多種機制允許開發者進行自行的定製和設置。
profile是用來描述某個環境下的配置信息的總稱,包括:數據庫連接,配置信息,名稱等等個性化的信息。
基於Maven pom文件的配置
profile設置
在以Maven管理的項目其核心流程與設置定在pom.xml文件中,包括這裏提到的profile信息。在maven的pom文件中,可以定義多個profile,並設置缺省的profile,在系統運行過程中,如果未指定profile,則使用缺省的profiles。
其設置格式定義如下:
<project>
.......
<profiles>
<!-- MySQL Local Profile Setting -->
<profile>
<id>mysqldev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<appserver.port>8080</appserver.port>
<app.debug.mode>true</app.debug.mode>
<database.type>MySQL</database.type>
<database.username>test1</database.username>
<database.driver>com.mysql.jdbc.Driver</database.driver>
<database.password>12345678</database.password>
<!-- create=true -->
<database.url>jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&&useSSL=false</database.url>
<!-- updatae -->
<database.ddl.action>update</database.ddl.action>
<database.dialect>org.hibernate.dialect.MySQL5Dialect</database.dialect>
<default.locale.info>zh_CN</default.locale.info>
</properties>
</profile>
<!-- Other Environment Setting -->
<profile>
<id>prod</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<appserver.port>8080</appserver.port>
<app.debug.mode>true</app.debug.mode>
<database.type>MySQL</database.type>
<database.username>root</database.username>
<database.driver>com.mysql.jdbc.Driver</database.driver>
<database.password>123456</database.password>
<!-- create=true -->
<database.url>jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&&useSSL=false</database.url>
<!-- updatae -->
<database.ddl.action>update</database.ddl.action>
<database.dialect>org.hibernate.dialect.MySQL5Dialect</database.dialect>
<default.locale.info>en_US</default.locale.info>
</properties>
</profile>
</profiles>
......
從上述設置中可以發現,activeByDefault用來設置缺省profile。profiles節點中定義了多個profile,每個profile都表示一套環境的設置和配置信息。
讀取配置信息
基於@Value讀取配置信息,示例如下:
@Component
@Data
public class ConfigBean {
@Value("${key.val1}")
private String keyVal;
}
第二種方式是基於配置文件的讀取,在配置文件中基於佔位符進行pom文件中值的替換。
system-config.properties
[email protected]@
配置文件實體類的讀取工具類:
@Data
@Configuration
@PropertySource(value={"classpath:systemconfig.properties"}, encoding="UTF-8")
public class SystemConfig {
@Value("${key.val1}")
private String keyVal;
}
在maven的命令行下進行profile的切換如下:
mvn clean package -P prod
-P profile_name: 指定profile的名稱
–spring.profiles.active=test: 指定活躍的profile name,此爲Java命令行的參數
基於profile的properties配置文件
在Spring Boot應用中,可以基於application.properties和application-{profile}.properties的方式來定義不同profile下的配置信息。
假定目前有dev/prod/test三個profile,其中通用的配置信息定義獨立定義在一個文件中,個性化的配置信息定義在各自獨立的配置文件中:
- application.propeties: 定義各個運行環境統一的配置信息
- application-dev.properties: 定義在dev中的各類配置文件
- application-test.properties: 定義在test環境下的各類配置信息
- application-prod.properties: 定義在prod環境下的各類配置信息
加載的順序,優先加載application.properties文件中的信息,然後根據profile的定義,加載相應的配置文件信息,例如application-dev.properties配置文件的信息等。
這樣設計的好處就是通用的配置與個性化的配置信息進行了隔離,在進行調整和修改之時,影響範圍變得可控和很小。
基於profile的yml配置文件
yml是一種非常簡潔清晰的配置文件格式,基於空格和層次遞進方式,扁平化顯示系統配置信息。Spring Boot基於yml定義profile的各類信息,定義格式如下:
spring:
profiles:
active: test
---
### Dev Setting
spring:
profiles: dev
server:
port: 8080
---
## Test Setting
spring:
profiles: test
server:
port: 8081
---
## Prod Setting
spring:
profiles: prod
server:
port: 8083
通過上述方式,可以簡潔地定義實現多個環境下的配置信息定義。
基於多yml文件的profile切換
此方式與property方式類似,都是將單個環境的配置信息定義在獨立的yml文件中,例如dev環境下的配置信息將定義在application-{profile}.yml, profile實際爲dev。
application.yml定義來通用的配置信息,其中通過spring.profile.active定義當前active的profile名稱。
示例如下:
application.yml
spring:
profiles:
active: test
app:
title:
name: default name
application-dev.yml:
### Dev Setting
spring:
profiles: dev
server:
port: 8080
app:
title:
name: dev name
application-test.yml:
## Test Setting
spring:
profiles: test
server:
port: 8081
app:
title:
name: test name
application-prod.yml:
## Prod Setting
spring:
profiles: prod
server:
port: 8083
app:
title:
name: prod name
本身的結構與property方式非常類似。
總結
綜合而言,yml更爲簡潔和層次分明,如果大家不熟悉的話,基於property文件,也可以實現完全實現同樣的功能。