Go 多环境下配置管理方案(多种方案)

作者:一名砍柴工 时间:2024-05-25 15:15:37 

需求

开发过程中开发者经常面对的一个需求就是:一个项目可能会在不同的环境下运行,本地开发环境、测试环境、灰度环境、生产环境。每个环境的参数和配置可能都会不相同,如服务器配置、数据库连接。为避免各环境产生数据混乱,让程序执行时在不同的环境中调用正确的配置,可以这样设计:

命令唤醒程序--->识别环境--->根据环境读取对应配置文件

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等 。后续继续学习更新这部分知识

来源:https://juejin.cn/post/7114045339908177957

标签:go,多环境,管理方案
0
投稿

猜你喜欢

  • mysql 定时任务的实现与使用方法示例

    2024-01-17 17:07:48
  • Git Submodule使用完整教程(小结)

    2022-06-29 21:01:06
  • jQuery 选择器的使用

    2008-01-21 13:07:00
  • CSS3的新特性

    2009-03-23 17:46:00
  • SqlServer系统数据库的作用深入了解

    2024-01-28 07:29:35
  • php mysql获取表字段名称和字段信息的三种方法

    2023-11-18 22:47:26
  • 亚马逊购物用户体验分析 (一)

    2009-10-25 12:40:00
  • Python制作春联的示例代码

    2022-12-10 13:57:23
  • 利用PyCharm操作Github(仓库新建、更新,代码回滚)

    2022-09-13 05:01:34
  • Python函数的默认参数设计示例详解

    2021-03-23 04:31:58
  • Python入门教程(十九)python的函数详解

    2023-08-20 06:45:38
  • css行高:line-height属性详解

    2008-06-24 11:42:00
  • Python用 matplotlib 绘制柱状图

    2023-01-22 01:20:50
  • python socket模块创建和使用套接字示例详解

    2021-12-30 13:05:49
  • asp远程网页数据采集常用函数代码

    2008-10-31 12:44:00
  • numpy中nan_to_num的具体使用

    2021-10-31 13:04:55
  • python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例

    2022-09-27 13:07:54
  • python matplotlib库直方图绘制详解

    2023-01-19 06:38:34
  • SQL事务用法begin tran,commit tran和rollback tran的用法

    2024-01-20 01:44:57
  • PHP Class&Object -- PHP 自排序二叉树的深入解析

    2024-06-05 09:48:33
  • asp之家 网络编程 m.aspxhome.com