SpringCloud入門之Spring Boot多環境配置切換指南


在 spring boot 中,有兩種配置文件,一種是application.properties,另一種是application.yml,兩種都可以配置spring boot 項目中的一些變量的定義,參數的設置等。

其中yml格式文件編寫規范參考文章手把手學系列之YAML格式文件規范學習

一般在一個項目中,總是會有好多個環境。比如:

開發環境 -> 測試環境 -> 預發布環境 -> 生產環境

每個環境上的配置文件總是不一樣的,甚至開發環境中每個開發者的環境可能也會有一點不同,配置讀取可是一個讓人有點傷腦筋的問題。

Spring Boot提供了一種優先級配置讀取的機制來幫助我們從這種困境中走出來。

常規情況下,我們都知道Spring Boot的配置會從application.properties中讀取。實際上,從resource目錄下的application.properties文件讀取是Spring Boot配置鏈中的一環而已。

根據Spring Boot的文檔,配置使用的優先級從高到低的順序,具體如下所示:

1. 命令行參數。 2. 通過 System.getProperties() 獲取的 Java 系統參數。 3. 操作系統環境變量。 4. 從 java:comp/env 得到的 JNDI 屬性。 5. 通過 RandomValuePropertySource 生成的“random.*”屬性。 6. 應用 Jar 文件之外的屬性文件(application.properties)。 7. 應用 Jar 文件內部的屬性文件(application.properties)。 8. 在應用配置 Java 類(包含“@Configuration”注解的 Java 類)中通過“@PropertySource”注解聲明的屬性文件。 9. 通過“SpringApplication.setDefaultProperties”聲明的默認屬性。 

這意味着,如果Spring Boot在優先級更高的位置找到了配置,那么它就會無視低級的配置。

方法一、不在配置文件寫上配置節定義,而是通過執行時定位不同配置單獨文件來區分。

比如,我在application.properties目錄中,寫入本地的MySQL的配置:

db.jdbc.driver=com.mysql.jdbc.Driver
db.jdbc.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8 db.jdbc.username=username db.jdbc.password=password 

在自己項目調試的階段,項目總是會使用本地的MySQL數據庫。而一旦打包之后,在外部聲明一個test_evn.properties.

啟動Jar包的時候, 指定一個外部配置文件:

java -jar demo.jar --spring.config.location=/path/test_evn.properties 

這樣一來,我們在開發者的機器上總是使用自己的配置,而一到對應的環境,就會使用高級的位置所做的配置。

方法二、在配置文件寫上配置節定義,在執行時傳遞配置節需激活定義名稱來區分。

1、在application.properties ,寫法如下:

spring.profiles.active=dev
spring.datasource.data-username=root
spring.datasource.data-password=root

2、在yml 文件中配置的話,寫法如下:

  

spring:
profiles:
active: prod
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test
username: root
password: root


啟動Jar包的時候:Java -jar xxxxxx.jar spring.profiles.actiove=prod 也可以這樣啟動設置配置文件,但是這只是用於開發和測試


下面提供一個在同一文件中定義多個配置節的詳細參考用例:
spring:
application:
name: config-server  #一般情況下這部分應放在bootstrap.yml或bootstrap.properties文件中
---
#服務配置
spring:
profiles: config-server1
#應用配置
cloud:
config:
label: master #git label(提交id,分支名稱或tag)
server:
git:
password: '' #登錄密碼
searchPaths: common-config #搜尋目錄,可以配置多個,用逗號分割
uri: #倉庫地址
username: '' #登錄用戶

#svn:
#uri: http://192.168.0.6/svn/repo/config-repo
#username: username
#password: password
#default-label: trunk
#profiles:
#active: subversion
server:
port: '8888' 
#eureka服務注冊地址
eureka: 
client: 
service-url: 
defaultZone: http://server1:8761/eureka/,http://server1:8762/eureka/,http://server1:8763/eureka/ 
#instance: 
#prefer-ip-address: true
---
#服務配置
spring:
profiles: config-server2
#應用配置
cloud:
config:
label: master #git label(提交id,分支名稱或tag)
server:
git:
password: '' #登錄密碼
searchPaths: common-config #搜尋目錄,可以配置多個,用逗號分割
uri: *** #倉庫地址
username: '' #登錄用戶

#svn:
#uri: http://192.168.0.6/svn/repo/config-repo
#username: username
#password: password
#default-label: trunk
#profiles:
#active: subversion
server:
port: '8889' 
#eureka服務注冊地址
eureka: 
client: 
service-url: 
defaultZone: http://server1:8761/eureka/,http://server1:8762/eureka/,http://server1:8763/eureka/ 
#instance: 
#prefer-ip-address: true

 

 

啟動Jar包的時候:

Java -jar xxxxxx.jar  --spring.profiles.active=config-server1 

Java -jar xxxxxx.jar  --spring.profiles.active=config-server2

在代碼中讀取這些配置也是非常方便的,在代碼的邏輯中,其實是無需去關心這個配置是從什么地方來的,只用關注能獲取什么配置就夠了。

public class ApplicationConfigure { @Value("${db.jdbc.driver}") private String jdbcDriver; @Value("${db.jdbc.url}") private String jdbcUrl; @Value("${db.jdbc.username}") private String jdbcUsername; @Value("${db.jdbc.password}") private String jdbcPassword; // mysql config class // ..... } 

有時候我們在項目啟動的時候,總是需要先啟動一些初始化的類,以前比較常見的做法是寫再static塊中,Spring Boot提供了一個CommandLineRunner接口,實現這個接口的類總是會被優先啟動,並優先執行CommandLineRunner接口中提供的run()方法。

public class ApplicationConfigure implements CommandLineRunner { @Value("${db.jdbc.driver}") private String jdbcDriver; @Value("${db.jdbc.url}") private String jdbcUrl; @Value("${db.jdbc.username}") private String jdbcUsername; @Value("${db.jdbc.password}") private String jdbcPassword; // mysql config class // ..... @Override public void run(String... strings) throws Exception { // 預先加載的一些方法,類,屬性。 } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM