寫到第九天了, 你可能寫了一些 Rest API 給前端在用, 也透過 Swagger 提供前端同事方便測試跟看規格, 也加上了 Cache 或是 Retry 來加強體驗, 也開始準備發佈到正式環境上....
but....千萬不要把你正式環境的帳號密碼 commit 到 git 裡啊, 也不要就這麼打包到 jar 裡面啊....XD
你會想說啊這樣不就每次上版都要去改設定檔...
但其實 spring boot 有一套抓取變數的規則, 以及切換的功能 來提供我們使用, 詳細可以看下面兩個說明
Externalized Configuration
Set the active Spring profiles
如果不想看那麼多字....
其實間單說就兩個重點
在啟動命令列可以切換不同的配置組態
組態檔位置可以透過命令列提供給SpringBoot
提供我目前的用法給大家參考
首先先從配置檔的檔名開始
我的 application.yml 都會只放些通用的 像下面這樣
spring:
application:
name: KpiServer
profiles:
active: dev
jackson:
date-format: com.fasterxml.jackson.databind.util.ISO8601DateFormat
time-zone: UTC
thymeleaf:
mode: LEGACYHTML5
resources:
chain:
cache: true
enabled: true
gzipped: true
cache-period: 604800
server:
port: ${port:8080}
compression:
enabled: true
例如一些 time-zone(時域), date-format(時間格式), resources.chain.cache(資源的快取)...等等
這邊要注意的是 spring.profiles.active 這邊指定 SpringBoot 啟動時要載入不同的設定檔
像我這邊是 active=dev , 所以他就會去找 application-dev.yml 這個檔案吃裡面的參數設定
你也可以不只一種....可以用 application-test.yml, application-docker.yml 等等來方便的切換
然後在我的 application-dev.yml 裡面你就可以看到不同環境的不同組態 像下面
application-dev.yml
spring:
datasource:
url: ${dburl:jdbc:mysql://10.0.0.162:3306/kpim?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&preferredTestQuery=select now()}
driver-class-name: com.mysql.cj.jdbc.Driver
username: ${dbusername:root}
password: ${dbpassword:123456}
jpa:
show-sql: false
mail:
host: 'mail.ooxx.com'
username: 'admin@ooxx.com'
password: 'AdminIsMe'
部署的時候我會在正式機上面放一份 application-prod.yml
然後我的 shell 會這樣下
sudo nohup java -jar nt-ask.jar --spring.profiles.active=prod --spring.config.location=application-prod.yml
這樣就可以了
請問「--config.location」是不是應該改成「--spring.config.location」?
的確是筆誤, 感謝提醒