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

 更新时间:2022年06月28日 14:54:09   作者:一名砍柴工  
这篇文章主要介绍了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多环境配置管理方案内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • go语言中函数的用法示例详解

    go语言中函数的用法示例详解

    Go语言中函数是基本的代码组织单元,用于封装一段代码,使代码结构更清晰、可复用,本文详细讲解了基本函数定义、参数传递、返回值、多返回值、匿名函数、递归和defer语句的使用,感兴趣的朋友一起看看吧
    2024-10-10
  • go按行读取文件的三种实现方式汇总

    go按行读取文件的三种实现方式汇总

    最近有遇到需要用go读取文件的情况,下面这篇文章主要给大家介绍了关于go按行读取文件的三种实现方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • golang如何实现mapreduce单进程版本详解

    golang如何实现mapreduce单进程版本详解

    这篇文章主要给大家介绍了关于golang如何实现mapreduce单进程版本的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • Golang学习笔记之延迟函数(defer)的使用小结

    Golang学习笔记之延迟函数(defer)的使用小结

    这篇文章主要介绍了Golang学习笔记之延迟函数(defer),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Golang应用程序性能优化技巧分享

    Golang应用程序性能优化技巧分享

    随着科技的进步,人人都想要快速的应用,这就需要优化您的应用程序性能。本文为大家整理了一些Golang应用程序性能优化的技巧,希望对大家有所帮助
    2023-04-04
  • Golang中int类型和字符串类型相互转换的实现方法

    Golang中int类型和字符串类型相互转换的实现方法

    在日常开发中,经常需要将数字转换为字符串或者将字符串转换为数字,在 Golang 中,有一些很简便的方法可以实现这个功能,接下来就详细讲解一下如何实现 int 类型和字符串类型之间的互相转换,需要的朋友可以参考下
    2023-09-09
  • 深入理解Golang make和new的区别及实现原理

    深入理解Golang make和new的区别及实现原理

    在Go语言中,有两个比较雷同的内置函数,分别是new和make方法,二者都可以用来分配内存,那他们有什么区别呢?下面我们就从底层来分析一下二者的不同。感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助
    2022-10-10
  • go 类型转换方式(interface 类型的转换)

    go 类型转换方式(interface 类型的转换)

    这篇文章主要介绍了go 类型转换方式(interface 类型的转换),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • go语言reflect.Type 和 reflect.Value 应用示例详解

    go语言reflect.Type 和 reflect.Value 应用示例详解

    这篇文章主要为大家介绍了go语言reflect.Type 和 reflect.Value 应用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • go实现thrift的网络传输性能及需要注意问题示例解析

    go实现thrift的网络传输性能及需要注意问题示例解析

    这篇文章主要为大家介绍了go实现thrift的网络传输性能及需要注意问题示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09

最新评论