Go?多環(huán)境下配置管理方案(多種方案)
需求
開發(fā)過程中開發(fā)者經(jīng)常面對的一個(gè)需求就是:一個(gè)項(xiàng)目可能會在不同的環(huán)境下運(yùn)行,本地開發(fā)環(huán)境、測試環(huán)境、灰度環(huán)境、生產(chǎn)環(huán)境。每個(gè)環(huán)境的參數(shù)和配置可能都會不相同,如服務(wù)器配置、數(shù)據(jù)庫連接。為避免各環(huán)境產(chǎn)生數(shù)據(jù)混亂,讓程序執(zhí)行時(shí)在不同的環(huán)境中調(diào)用正確的配置,可以這樣設(shè)計(jì):
命令喚醒程序--->識別環(huán)境--->根據(jù)環(huán)境讀取對應(yīng)配置文件

方案1:配置文件管理
根據(jù)環(huán)境創(chuàng)建配置文件,多個(gè)環(huán)境多個(gè)配置文件。如開發(fā)環(huán)境 config-dev.yaml,測試環(huán)境 config-test.yaml,預(yù)發(fā)環(huán)境 config-pre.yaml,生產(chǎn)環(huán)境 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))
}
}
進(jìn)一步優(yōu)化,通過配置環(huán)境變量,然后通過環(huán)境變量來區(qū)分配置文件。首先在電腦上配置環(huán)境變量:
vim .bash_profile export GO_ENV= true source .bash_profile
在代碼層面上就可以通過環(huán)境配置來區(qū)分配置文件
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"
}
}
通過設(shè)置環(huán)境變量讀取配置文件,這種方式使用方便,現(xiàn)在很多開發(fā)者都會這樣使用,但是當(dāng)服務(wù)在集群環(huán)境上可能會有很多問題。
- 配置文件也存在于項(xiàng)目中,基本所有開發(fā)者都能看到生產(chǎn)環(huán)境配置。生產(chǎn)環(huán)境配置因之開放給部分人員
- 如果有很多個(gè)微服務(wù),當(dāng)我們修改配置時(shí)就需要全部的配置都需要修改,增加工作量。我們需要一個(gè)可以統(tǒng)一管理的地方
統(tǒng)一管理配置文件,所有服務(wù)都只針對一份配置文件,可以保證唯一性;配置環(huán)境也需要權(quán)限隔離,部分開發(fā)者擁有生產(chǎn)配置權(quán)限。
方案2:集中式管理配置
通過使用 Redis 統(tǒng)一管理,在比較大規(guī)模的微服務(wù)體系中可以引入配置中心。集中式管理的優(yōu)勢:
- 安全:集中管理而不是在代碼中,防止配置泄露
- 動態(tài):支持動態(tài)調(diào)整配置,而不影響其他服務(wù)
- 實(shí)時(shí):修改配置,即時(shí)生效,無需重啟服務(wù)器
方式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:如果使用配置中心服務(wù),可以使用 Nacos、Apollo等 。后續(xù)繼續(xù)學(xué)習(xí)更新這部分知識
到此這篇關(guān)于Go 多環(huán)境下配置管理方案的文章就介紹到這了,更多相關(guān)go多環(huán)境配置管理方案內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go 循環(huán)結(jié)構(gòu)for循環(huán)使用教程全面講解
這篇文章主要為大家介紹了Go 循環(huán)結(jié)構(gòu)for循環(huán)使用全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Go語言實(shí)現(xiàn)一個(gè)Http?Server框架(一)?http庫的使用
本文主要介紹用Go語言實(shí)現(xiàn)一個(gè)Http?Server框架中對http庫的基本使用說明,文中有詳細(xì)的代碼示例,感興趣的同學(xué)可以借鑒一下2023-04-04
Go1.18?新特性之多模塊Multi-Module工作區(qū)模式
這篇文章主要介紹了Go1.18?新特性之多模塊Multi-Module工作區(qū)模式,在 Go 1.18之前,建議使用依賴模塊中的 replace 指令來處理這個(gè)問題,從 Go 1.18開始引入了一種同時(shí)處理多個(gè)模塊的新方法,通過案例給大家詳細(xì)介紹,感興趣的朋友一起看看吧2022-04-04
Go中的函數(shù)選項(xiàng)模式(Functional Options Pattern)詳解
在 Go 語言中,函數(shù)選項(xiàng)模式是一種優(yōu)雅的設(shè)計(jì)模式,用于處理函數(shù)的可選參數(shù),本文將對其進(jìn)行講解,準(zhǔn)備好了嗎,快跟隨著本文一探究竟吧2023-06-06
golang用melody搭建輕量的websocket服務(wù)的示例代碼
在Go中,可以使用gin和melody庫來搭建一個(gè)輕量級的WebSocket服務(wù),gin是一個(gè)流行的Web框架,而melody是一個(gè)用于處理WebSocket的庫,本文給大家演示如何使用gin和melody搭建WebSocket服務(wù),感興趣的朋友一起看看吧2023-10-10
Go Mongox輕松實(shí)現(xiàn)MongoDB的時(shí)間字段自動填充
這篇文章主要為大家詳細(xì)介紹了Go語言如何使用 mongox 庫,在插入和更新數(shù)據(jù)時(shí)自動填充時(shí)間字段,從而提升開發(fā)效率并減少重復(fù)代碼,需要的可以參考下2025-02-02
go語言中基本數(shù)據(jù)類型及應(yīng)用快速了解
這篇文章主要為大家介紹了go語言中基本數(shù)據(jù)類型應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07

