Spring Boot下Profile的四種切換方式思路總結

bladestone發表於2019-03-19

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&amp;&amp;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&amp;&amp;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

   key.val1=@pom.key.val1@

配置檔案實體類的讀取工具類:

@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檔案,也可以實現完全實現同樣的功能。

相關文章