我心目中的配置中心應該怎麼做?
最近有使用攜程開源的ofollow,noindex" target="_blank">apollo
。Golang的客戶端的使用用法大概是agollo.GetStringValue("GRPCAddr", "")
這樣。
apollo的好處在於方便管控,熱更新。但是實際開發過程中,更新配置非常麻煩,需要去配置中心更新配置,然後釋出,然後等待
5-10s等配置熱更新,但是通常來說,諸如資料庫等配置是不會更新的,因為通常資料庫連線池會在程式啟動的時候初始化,之後
就不會再更新。此外,使用方式也不是很方便,這樣程式中充斥著上面的程式碼,反而不如config.GRPCAddr
這樣來的簡介明瞭。
所以我心目中的配置中心應當是:
- 遵守 12 factors,所有配置從環境變數中讀取 - 配置寫在配置檔案中例如 `k8s/deploy.yml` 或者 `docker-compose.yml` 中,然後進行加密,對應工具拉起程式之後會把配置 寫入環境變數, 程式啟動之後會從環境變數讀取 - 配置檔案需要加密,重要的事情再強調一遍 - 配置使用一個單例,將配置寫入到單例的某個屬性中
例如Python:
from loka import LokaConfig class Config(LokaConfig): MYSQL_URI = "mysql://[email protected]:3306" LISTEN_PORT = 8080 config = Config() # below is just for test print(config.MYSQL_URI, type(config.MYSQL_URI)) print(config.LISTEN_PORT, type(config.LISTEN_PORT))
例如Golang:
main() { // Config is test demo type Config struct { Foostring Barstring Booleanbool ReplicaNum int } c := Config{Foo: "hello"} log.Printf("before, c: %+v", c) LoadFromEnv(&c) log.Printf("after, c: %+v", c) }
參考資料: