昨日文章提到配置檔可以讓我們方便分開每個環境的設定,但是除了環境以外,我們也可以運用在同一份程式碼建置多個站別。
以下範例的程式碼可以在這邊下載
我們在下方開始動手實作如何載入配置檔,而我先選json
格式作為檔案格式。
/
|--- /config/ # <--- 存放配置檔的資料夾
| |
| |-- site_A.json
| |-- site_B.json
|
|
|-- main.go
先建立一個寫兩份檔案:site_A.json
、site_B.json
。資料結構如下:
{
"app": "Simple Server",
"name": "Site A",
"port": 8000,
"db": {
"username": "user_a",
"password": "ajivx_vm@$JAIX"
}
}
{
"app": "Simple Server",
"name": "Site B",
"port": 8001,
"db": {
"username": "user_b",
"password": "thI%^0rZi@"
}
}
再來是讀取檔案。雖然專業名詞是「載入配置」,說穿了也只是一般的開啟檔案、讀取檔案。
// 使用Go語言做讀檔動作
f, err := ioutil.ReadFile("config/site_A.json")
if err != nil {
panic(err)
}
fmt.Println(string(f))
// 定義配置資料結構
var configData struct {
App string `json:"app"`
Name string `json:"Name"`
Port int `json:"port"`
DB struct {
Username string `json:"username"`
Password string `json:"password"`
} `json:"db"`
}
// 使用JSON解碼
err = json.Unmarshal(f, &configData)
if err != nil {
panic(err)
}
// 顯示配置資料
fmt.Println("Project Name", configData.Name)
// Output: Project Name Site A
router := http.NewServeMux()
router.HandleFunc("/api-demo", func(w http.ResponseWriter, r *http.Request) {
// 使用配置檔.第一式:在API加上
w.Write([]byte("目前專案名稱是" + configData.Name))
})
// 使用配置檔.第二式:決定伺服器的Port
addr := fmt.Sprintf(":%d", configData.Port)
log.Println("開始建立伺服器 ", addr)
log.Fatal(http.ListenAndServe(addr, router))
// 使用配置檔.第三式:決定DB連線的帳密或IP
_ = fmt.Sprintf("connect database: username=%s password=%s",
configData.DB.Username,
configData.DB.Password,
)
PO上完成圖
雖然上述步驟已經完成載入與應用了,但是好像缺少了什麼?
啊!那怎麼在啟動程式時,決定要採用哪一份檔案呢?
有幾種做法:
CONF_FILE=site_A
[指令]site_A
what_config.txt
,這份檔案裡面定義site_A
而這邊,我們使用第一種做法「透過環境變數」
configFile := os.Getenv("CONF_FILE") // <--- 讀取環境變數,使用程式載入設定
f, err := ioutil.ReadFile("config/" + configFile + ".json") // +++ configFile
if err != nil {
panic(err)
}
fmt.Println(string(f))
// ....以下省略
配置檔(或稱設定檔)在眾多專案都佔著極其重要,但又容易被忽略的一個環節。其實配置檔觀念很簡單,只要善用配置管理,就能更善用同一份程式碼做更多的應用。
透過今日的載入配置範例,相信大家更進一步瞭解配置檔的應用。
ps. 由於最近工作繁忙,差點趕不上截止時間,所以先發表文章以免中斷,敬請見諒