GoFrame 配置管理-文件配置

2022-03-29 15:25 更新

?gcfg?組件采用接口化設(shè)計,默認提供的是基于文件系統(tǒng)的接口實現(xiàn)。支持的數(shù)據(jù)文件格式包括: ?JSON/XML/YAML(YML)/TOML/INI?,項目中開發(fā)者可以靈活地選擇自己熟悉的配置文件格式來進行配置管理。

配置文件

默認配置文件

配置對象我們推薦使用單例方式獲取,單例對象將會按照文件后綴?toml/yaml/yml/json/ini/xml?文自動檢索配置文件。默認情況下會自動檢索配置文件?config.toml/yaml/yml/json/ini/xml?并緩存,配置文件在外部被修改時將會自動刷新緩存。

如果想要自定義文件格式,可以通過?SetFileName?方法修改默認讀取的配置文件名稱(如:?default.yaml?, ?default.json?, ?default.xml?等等)。例如,我們可以通過以下方式讀取?default.yaml?配置文件中的數(shù)據(jù)庫?database?配置項。

// 設(shè)置默認配置文件,默認讀取的配置文件設(shè)置為 default.yaml
g.Cfg().GetAdapter().(*gcfg.AdapterFile).SetFileName("default.yaml")

// 后續(xù)讀取時將會讀取到 default.yaml 配置文件內(nèi)容,
g.Cfg().Get("database")

默認文件修改

文件可以是一個具體的文件名稱或者完整的文件絕對路徑。

我們可以通過多種方式修改默認文件名稱:

  1. 通過配置管理方法?SetFileName?修改。
  2. 修改命令行啟動參數(shù) - ?gf.gcfg.file?。
  3. 修改指定的環(huán)境變量 - ?GF_GCFG_FILE?。

假如我們的執(zhí)行程序文件為?main?,那么可以通過以下方式修改配置管理器的配置文件目錄(?Linux?下):

1、通過單例模式

g.Cfg().GetAdapter().(*gcfg.AdapterFile).SetFileName("default.yaml")

2、通過命令行啟動參數(shù)

 ./main --gf.gcfg.file=config.prod.toml

3、通過環(huán)境變量(常用在容器中)

  • 啟動時修改環(huán)境變量:
  GF_GCFG_FILE=config.prod.toml; ./main
  • 使用?genv?模塊來修改環(huán)境變量:
  genv.Set("GF_GCFG_FILE", "config.prod.toml")

配置目錄

目錄配置方法

?gcfg?配置管理器支持非常靈活的多目錄自動搜索功能,通過?SetPath?可以修改目錄管理目錄為唯一的目錄地址,同時,我們推薦通過?AddPath?方法添加多個搜索目錄,配置管理器底層將會按照添加目錄的順序作為優(yōu)先級進行自動檢索。直到檢索到一個匹配的文件路徑為止,如果在所有搜索目錄下查找不到配置文件,那么會返回失敗。

默認目錄配置

?gcfg?配置管理對象初始化時,默認會自動添加以下配置文件搜索目錄:

1、當前工作目錄及其下的?config?、?manifest/config?目錄:例如當前的工作目錄為?/home/www?時,將會添加:

  • ?/home/www ?
  • ?/home/www/config ?
  • ?/home/www/manifest/config ?

2、當前可執(zhí)行文件所在目錄及其下的?config?、?manifest/config?目錄:例如二進制文件所在目錄為?/tmp?時,將會添加:

  • ?/tmp ?
  • ?/tmp/config ?
  • ?/tmp/manifest/config ?

3、當前?main?源代碼包所在目錄及其下的?config?、?manifest/config?目錄(僅對源碼開發(fā)環(huán)境有效):例如?main?包所在目錄為?/home/john/workspace/gf-app?時,將會添加:

  • ?/home/john/workspace/gf-app ?
  • ?/home/john/workspace/gf-app/config ?
  • ?/home/john/workspace/gf-app/manifest/config?

默認目錄修改

注意這里修改的參數(shù)必須是一個目錄,不能是文件路徑。

我們可以通過以下方式修改配置管理器的配置文件搜索目錄,配置管理對象將會只在該指定目錄執(zhí)行配置文件檢索:

  1. 通過配置管理器的?SetPath?方法手動修改;
  2. 修改命令行啟動參數(shù) - ?gf.gcfg.path?;
  3. 修改指定的環(huán)境變量 - ?GF_GCFG_PATH?;

假如我們的執(zhí)行程序文件為?main?,那么可以通過以下方式修改配置管理器的配置文件目錄(?Linux?下):

1、通過單例模式

g.Cfg().GetAdapter().(*gcfg.AdapterFile).SetPath("/opt/config")

2、通過命令行啟動參數(shù)

 ./main --gf.gcfg.path=/opt/config/

3、通過環(huán)境變量(常用在容器中)

  • 啟動時修改環(huán)境變量:
  GF_GCFG_PATH=/opt/config/; ./main
  • 使用?genv?模塊來修改環(huán)境變量:
  genv.Set("GF_GCFG_PATH", "/opt/config")

內(nèi)容配置

?gcfg?包也支持直接內(nèi)容配置,而不是讀取配置文件,常用于程序內(nèi)部動態(tài)修改配置內(nèi)容。通過以下包配置方法實現(xiàn)全局的配置:

func (c *AdapterFile) SetContent(content string, file ...string)
func (c *AdapterFile) GetContent(file ...string) string
func (c *AdapterFile) RemoveContent(file ...string)
func (c *AdapterFile) ClearContent()

需要注意的是該配置是全局生效的,并且優(yōu)先級會高于讀取配置文件。因此,假如我們通過?SetContent("v = 1", "config.toml")?配置了?config.toml?的配置內(nèi)容,并且也同時存在?config.toml?配置文件,那么只會使用到?SetContent?的配置內(nèi)容,而配置文件內(nèi)容將會被忽略。

層級訪問

在默認提供的文件系統(tǒng)接口實現(xiàn)下,?gcfg?組件支持按層級獲取配置數(shù)據(jù),層級訪問默認通過英文?.?號指定,其中?pattern?參數(shù)和 通用編解碼?-gjson? 的?pattern?參數(shù)一致。例如以下配置(?config.yaml?):

server:
  address:    ":8199"
  serverRoot: "resource/public"

database:
  default:
    link:   "mysql:root:12345678@tcp(127.0.0.1:3306)/focus"
    debug:  true

例如針對以上配置文件內(nèi)容的層級讀?。?/p>

// :8199
g.Cfg().Get("server.address")

// true
g.Cfg().Get("database.default.debug")

注意事項

大家都知道,在Golang里面,?map/slice?類型其實是一個”引用類型”(也叫”指針類型”),因此當你對這種類型的變量 鍵值對/索引項 進行修改時,會同時修改到其對應的底層數(shù)據(jù)。從效率上考慮,?gcfg?包某些獲取方法返回的數(shù)據(jù)類型為?map/slice?時,沒有對其做值拷貝,因此當你對返回的數(shù)據(jù)進行修改時,會同時修改?gcfg?對應的底層數(shù)據(jù)。

例如:

// For testing/example only.
content := `{"map":{"key":"value"}, "slice":[59,90]}`
gcfg.SetContent(content)
defer gcfg.RemoveContent()

m := g.Cfg().GetMap("map")
fmt.Println(m)

// Change the key-value pair.
m["key"] = "john"

// It changes the underlying key-value pair.
fmt.Println(g.Cfg().GetMap("map"))

s := g.Cfg().GetArray("slice")
fmt.Println(s)

// Change the value of specified index.
s[0] = 100

// It changes the underlying slice.
fmt.Println(g.Cfg().GetArray("slice"))

// output:
// map[key:value]
// map[key:john]
// [59 90]
// [100 90]

檢測更新

配置管理器使用了緩存機制,當配置文件第一次被讀取后會被緩存到內(nèi)存中,下一次讀取時將會直接從緩存中獲取,以提高性能。同時,配置管理器提供了對配置文件的自動檢測更新機制,當配置文件在外部被修改后,配置管理器能夠即時地刷新配置文件的緩存內(nèi)容。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號