Go 多環境下配置管理方案(多種方案)
需求
開發過程中開發者經常面對的一個需求就是:一個項目可能會在不同的環境下運行,本地開發環境、測試環境、灰度環境、生產環境。每個環境的參數和配置可能都會不相同,如服務器配置、數據庫連接。為避免各環境產生數據混亂,讓程序執行時在不同的環境中調用正確的配置,可以這樣設計:
命令喚醒程序—>識別環境—>根據環境讀取對應配置文件
方案1:配置文件管理
根據環境創建配置文件,多個環境多個配置文件。如開發環境 config-dev.yaml,測試環境 config-test.yaml,預發環境 config-pre.yaml,生產環境 config-prod.yaml。
在代碼層面上控制想要使用的配置文件,然後使用第三方包 Flag 或者 viper 讀取配置文件。該方式不夠自動化,如果每次都需要修改代碼,上線後如果忘記修改瞭就容易造成問題。
func main(){ configFile := './config/config-dev.yaml' // './config/confg-test.yaml' //使用 viper v := viper.New() v.SetConfigFile(configFile) v.SetConfigType("yaml") if err := v.ReadInConfig(); err != nil { panic(fmt.Errorf("read config failed: %s \n", err)) } }
進一步優化,通過配置環境變量,然後通過環境變量來區分配置文件。首先在電腦上配置環境變量:
vim .bash_profile export GO_ENV= true source .bash_profile
在代碼層面上就可以通過環境配置來區分配置文件
func main(){ configEnv := os.Getenv("GO_ENV"); switch configEnv { case "dev": configPath = "./config-dev.yaml" case "test": configPath = "./config-test.yaml" case "prod": configPath = "./config-prod.yaml" } }
通過設置環境變量讀取配置文件,這種方式使用方便,現在很多開發者都會這樣使用,但是當服務在集群環境上可能會有很多問題。
- 配置文件也存在於項目中,基本所有開發者都能看到生產環境配置。生產環境配置因之開放給部分人員
- 如果有很多個微服務,當我們修改配置時就需要全部的配置都需要修改,增加工作量。我們需要一個可以統一管理的地方
統一管理配置文件,所有服務都隻針對一份配置文件,可以保證唯一性;配置環境也需要權限隔離,部分開發者擁有生產配置權限。
方案2:集中式管理配置
通過使用 Redis 統一管理,在比較大規模的微服務體系中可以引入配置中心。集中式管理的優勢:
- 安全:集中管理而不是在代碼中,防止配置泄露
- 動態:支持動態調整配置,而不影響其他服務
- 實時:修改配置,即時生效,無需重啟服務器
方式1:如果使用 Redis ,可以使用工具包 github.com/gogap/env_json
func main() { data, _ := ioutil.ReadFile("./db.conf") dbConf := DBConfig{} if err := env_json.Unmarshal(data, &dbConf); err != nil { fmt.Print(err) return } fmt.Println(dbConf) }
方式2:如果使用配置中心服務,可以使用 Nacos、Apollo等 。後續繼續學習更新這部分知識
到此這篇關於Go 多環境下配置管理方案的文章就介紹到這瞭,更多相關go多環境配置管理方案內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Go語言讀取YAML 配置文件的兩種方式分享
- go項目中環境變量的配置
- golang讀取各種配置文件(ini、json、yaml)
- Python常用配置文件ini、json、yaml讀寫總結
- node.js讀寫json文件的方法