使用viper管理配置文件 并 实现使用环境变量覆盖配置文件
来源:http://www.tudoupe.com时间:2022-02-27
需求:
使用viper管理配置文件。项目部署后,通过修改环境变量,以达到使用环境变量中的配置 覆盖 config file中配置的目的。
一、使用viper来管理配置文件
// 代码结构
通过 EXPORT APP_TEST_ENV=000233设置环境变量,覆盖配置文件中的 TEST_ENV
实验验证成功!
二、对于非嵌套型配置
可直接通过 viper.Unmarshal(&ConfigSetting) 进行读取,方法执行时,如果 AutomaticEnv = true,且 viper.SetEnvPrefix(“app”) 设置成功。那么在加载配置文件的时候,会自动使用env中的配置将配置文件中的配置覆盖掉;其配置文件与env中项的对应关系为:
APP_TEST_ENV(环境变量中的配置,必须为全部大写) <=> Test_Env(此处为配置文件中的项,大小写不敏感)
总结:
在非嵌套型的配置中,可以通过设置 EnvPrefix 和 AutomaticEnv 来自动使用env覆盖config中的配置项
三、对于嵌套型配置
通过 viper.UnmarshalKey(“groups”, &GroupsSetting) 将配置文件中 groups 下的全部配置加载到 GroupsSetting 中。
若环境变量中存在了 APP_GROUPS = xxx ;此时会出现报错,因为上述方法执行的时候,会将环境变量中的配置读取出来,并替换掉配置文件中groups下的全部数据。(注意,通过env读取到的groups数据,全部为string类型的;而在配置文件中读取的数据为map型的)此时报错信息为:
对于该问题,可以通过自定义 DecoderConfigOption 钩子函数来解决问题。// TODO 还未完成
-------------------------------------补充Hook函数解决方案----------------------------------------
3-1、首先对UnmarshalKey源码进行分析
源码分析
通过 viper.DecodeHook()解决问题
【总结】
上述方案可以通过viper本身的设计,以精简的代码完成需求, 但在env整体覆盖config中的某个模块的全部配置文件,是否更方便?不过在Google里查到的解决方案,都是在env中使用 json string 整体覆盖 config file 中配置的。参考 https://github.com/spf13/viper/issues/641
另外该方式有个缺点,在使用 export 将某个模块的配置加到env之后,如果 加到env中的json string中不能包含全部的配置子项,那么该配置将会为空;
但该方式也有个优点,yaml的嵌套层次可以无限递归下去. 亲测有效;
四、针对于嵌套型配置的解决方案
使用反射技术来完成。如果使用如下方案,那么在初始化viper的时候,无需设置 envpreifx 和 automaticenv
五、Grafana项目中的配置文件读取方式调研
Grafana开源项目可以自行检索,非常棒的一个项目;
相关新闻
- 2023-05-06 微pe怎么初始化U盘(微pe怎么恢复初
- 2023-05-06 Xp系统boot 进入pe(boot manager 怎么进入
- 2023-05-06 win pe修复bcdboot(pe修复系统)
- 2023-05-06 win7更新失败 pe(win7更新失败还原更
- 2023-05-06 u盘装了pe读取不了(u盘能进pe读取不
- 2023-05-06 u盘pe 发热(u盘发热烫手)
- 2023-05-06 u盘pe下看不到硬盘(u盘启动pe看不到
- 2023-05-06 pe盘 ntfs(u盘ntfs格式)
- 2023-05-06 sony笔记本进入pe模式(联想笔记本怎
- 2023-05-06 pe启动盘进不去(pe启动盘进不去系统
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
