網站首頁 編程語言 正文
需求
開發(fā)過程中開發(fā)者經常面對的一個需求就是:一個項目可能會在不同的環(huán)境下運行,本地開發(fā)環(huán)境、測試環(huán)境、灰度環(huán)境、生產環(huán)境。每個環(huán)境的參數和配置可能都會不相同,如服務器配置、數據庫連接。為避免各環(huán)境產生數據混亂,讓程序執(zhí)行時在不同的環(huán)境中調用正確的配置,可以這樣設計:
命令喚醒程序--->識別環(huán)境--->根據環(huán)境讀取對應配置文件
方案1:配置文件管理
根據環(huán)境創(chuàng)建配置文件,多個環(huán)境多個配置文件。如開發(fā)環(huán)境 config-dev.yaml,測試環(huán)境 config-test.yaml,預發(fā)環(huán)境 config-pre.yaml,生產環(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)) } }
進一步優(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" } }
通過設置環(huán)境變量讀取配置文件,這種方式使用方便,現在很多開發(fā)者都會這樣使用,但是當服務在集群環(huán)境上可能會有很多問題。
- 配置文件也存在于項目中,基本所有開發(fā)者都能看到生產環(huán)境配置。生產環(huán)境配置因之開放給部分人員
- 如果有很多個微服務,當我們修改配置時就需要全部的配置都需要修改,增加工作量。我們需要一個可以統一管理的地方
統一管理配置文件,所有服務都只針對一份配置文件,可以保證唯一性;配置環(huán)境也需要權限隔離,部分開發(fā)者擁有生產配置權限。
方案2:集中式管理配置
通過使用 Redis 統一管理,在比較大規(guī)模的微服務體系中可以引入配置中心。集中式管理的優(yōu)勢:
- 安全:集中管理而不是在代碼中,防止配置泄露
- 動態(tài):支持動態(tài)調整配置,而不影響其他服務
- 實時:修改配置,即時生效,無需重啟服務器
方式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等 。后續(xù)繼續(xù)學習更新這部分知識
原文鏈接:https://juejin.cn/post/7114045339908177957
相關推薦
- 2022-04-06 Android關于Button背景或樣式失效問題解決方法_Android
- 2022-05-13 C++ 減少臨時字符串對象的產生
- 2022-09-05 C語言深入淺出分析函數指針_C 語言
- 2022-07-14 使用react-activation實現keepAlive支持返回傳參_React
- 2022-09-30 React前端渲染優(yōu)化--父組件導致子組件重復渲染的問題_React
- 2022-07-10 詳解HashSet并發(fā)修改異常
- 2022-10-04 Go語言底層原理互斥鎖的實現原理_Golang
- 2022-08-15 Android開發(fā)gradle拉取依賴的加速配置_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支