Go 多环境下配置管理方案(多种方案)
作者:一名砍柴工 发布时间:2024-05-25 15:15:37
需求
开发过程中开发者经常面对的一个需求就是:一个项目可能会在不同的环境下运行,本地开发环境、测试环境、灰度环境、生产环境。每个环境的参数和配置可能都会不相同,如服务器配置、数据库连接。为避免各环境产生数据混乱,让程序执行时在不同的环境中调用正确的配置,可以这样设计:
命令唤醒程序--->识别环境--->根据环境读取对应配置文件
方案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等 。后续继续学习更新这部分知识
来源:https://juejin.cn/post/7114045339908177957


猜你喜欢
- 在做web端自动化测试用例编写过程中,大家有没有遇到窗口切换的情况,比如如下截图所示的商品列表页,点击任何一款产品后切换到这块产品详情页的情
- 本文实例讲述了python中引用与复制用法。分享给大家供大家参考。具体分析如下:在python中,任何不可变对象是传值的,而可变对象是传引用
- Windows安装mysql-5.7.17-winx64.zip方式记录<1.去官网上下载.zip格式的文件.2.解压到一个文件夹,这
- 现在大部分网站都使用asp+access构建,这样的话通过下载access数据库简单就可以对网站进行破坏! 而很多的网站都不太重
- 一场大雪,覆盖了华北、华东。天地连成一片,城市银装素裹,处处诗情画意、人人兴高采烈。朋友圈被雪景图和调侃路滑摔跤的段子刷屏,气氛比过年还要热
- 问题你正在试着使用正则表达式去匹配一大块的文本,而你需要跨越多行去匹配。解决方案这个问题很典型的出现在当你用点(.)去匹配任意字符的时候,忘
- 那天突然的一个灵感,是针对防盗链的。正常上传的文件,若被人盗链则增加了自己服务器的负担,上次164.cc就因此被挂。然后想想对策,目前各类防
- 注:本篇文章主要介绍如何在 Go 语言中定义和使用自定义类型,涉及到一定的编程基础知识和语法。如有不熟悉的地方,建议先去学习相关的基础知识。
- 本篇介绍Python字典的常见操作。修改字典元素,如图。添加字典元素,如图。删除字典元素del方法,如图。删除字典元素clear方法,如图。
- 使用场景:1) 爬虫设置ip代理池时验证ip是否有效2)进行压测时,进行批量请求等等场景grequests 利用 requests和geve
- Dreaweaver MX 2004 中增加了图片处理功能,如图片亮度和对比度的调节、图片的锐化效果等
- 在写代码过程中我们常常可能会遇到这样一种情况,要对一个list中的每个元素做同样的操作时,两种方法方法一:循环遍历每个元素 话不多说,上代码
- 前言本文主要介绍 MySQL 是如何开启一个事务的,相关资料也可以查阅官方文档。https://dev.mysql.com/doc/refm
- 一,什么是mycat一个彻底开源的,面向企业应用开发的大数据库集群支持事务、ACID、可以替代MySQL的加强版数据库一个可以视为MySQL
- 我最近在涉及大量数据处理的项目中频繁使用 sqlite3。我最初的尝试根本不涉及任何数据库,所有的数据都将保存在内存中,包括字典查找、迭代和
- 概述本文主要介绍一种降维方法,PCA(Principal Component Analysis,主成分分析)。降维致力于解决三类问题。1.
- python2中的unicode()函数在python3中会报错:NameError: name 'unicode' is
- 内容摘要:本文介绍了使用asp来JMail v4.3发信的大部分常用方法,包括邮件基本信息、身份验证、附件等。无需很多的修改就可以
- 该组件基于技术栈,主要涉及vue-cli生成的webpack项目脚手架,在此脚手架项目基础上完成的,整合了element-ui开源vue的U
- 变量覆盖漏洞<?php$flag='xxx'; extract($_GET); if(isset($shiyan))