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

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

   [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文件,也可以實現完全實現同樣的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章