go-viper实践
一、需求
1. 本地开发读取yaml中的配置,并序列化成对象
2. 支持线上环境配置env
3. 本地环境和线上环境无缝衔接不需要修改代码
二、viper实践
1. viper文档
viper文档
2. 配置本地yaml
settings:application:# dev开发环境 test测试环境 prod线上环境mode: dev# 服务器ip,默认使用 0.0.0.0host: 0.0.0.0# 服务名称name: DemoApp# 服务端口号port: 8000 # 读超时(s)readtimeout: 10# 写超时(s)writertimeout: 2# 数据权限功能开关enabledp: false
3. 封装config对象,并加载配置
代码如下(示例):
package configimport ("fmt""github.com/spf13/viper""strings"
)var ApplicationConfig = new(Application)type Application struct {ReadTimeout intWriterTimeout intHost stringPort int64Name stringMode stringDemoMsg string
}// Config 配置集合
type Config struct {Application *Application `yaml:"application"`
}type Settings struct {Settings Config `yaml:"settings"`
}var _cfg *Settings// Setup 载入配置文件
func Setup(configFile string, fs ...func()) {_cfg = &Settings{Settings: Config{Application: ApplicationConfig,},}v := viper.New()//自动获取全部的env加入到viper中。(如果环境变量多就全部加进来)默认别名和环境变量名一致v.AutomaticEnv()//将加入的环境变量*_*_格式替换成 *.*格式//(因为从环境变量读是按"a.b.c.d"的格式读取,所以要给在viper维护一个别名对象,给环境变量一个别名)v.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))// 配置文件位置v.SetConfigFile(configFile)//支持 "yaml", "yml", "json", "toml", "hcl", "tfvars", "ini", "properties", "props", "prop", "dotenv", "env":v.SetConfigType("yaml")//读文件到viper配置中err := v.ReadInConfig()if err != nil {panic(fmt.Errorf("Fatal error config file: %s \n", err))}// 系列化成config对象if err := v.Unmarshal(&_cfg); err != nil {fmt.Println(err)}fmt.Println("所有的key: ")for _,k := range v.AllKeys(){fmt.Println(k)}fmt.Println("所有的config: \n",v.AllSettings())}
4. 单元测试
代码如下(示例):
import ("encoding/json""fmt""github.com/spf13/viper""os""strings""testing"
)func init() {os.Setenv("SETTINGS_APPLICATION_MODE","test")os.Setenv("SETTINGS_APPLICATION_HOST","127.0.0.10")os.Setenv("SETTINGS_APPLICATION_NAME","APP")os.Setenv("SETTINGS_APPLICATION_PORT","9001")os.Setenv("SETTINGS_APPLICATION_READTIMEOUT","1")os.Setenv("SETTINGS_APPLICATION_ENABLEDP","true")
}func TestSetup(t *testing.T) {Setup("app_settings.yaml")marshal, err := json.Marshal(_cfg)if err != nil {fmt.Println(err)}fmt.Println("序列化config: \n",string(marshal))
}
执行结果:
=== RUN TestSetup
所有的key:
settings.application.enabledp
settings.application.mode
settings.application.host
settings.application.name
settings.application.port
settings.application.readtimeout
settings.application.writertimeout
所有的config: map[settings:map[application:map[enabledp:true host:127.0.0.10 mode:test name:APP port:9001 readtimeout:1 writertimeout:2]]]
序列化config: {"Settings":{"Application":{"ReadTimeout":1,"WriterTimeout":2,"Host":"127.0.0.10","Port":9001,"Name":"APP","Mode":"test","DemoMsg":""}}}
--- PASS: TestViperSettings (0.00s)
PASS
总结
通过实践,viper能够满足本地环境和线上环境的无缝切换,自动识别环境变量。
1. yaml + env 思路
- 从yaml中读取配置,主要是为了序列化出要用到的参数。
- 使用v.AutomaticEnv(),自动加载出环境变量到viper。
- 将环境变量替换成掉yaml中读取的值。(注意:LoopEnv 环境变量如果存在就返回,如果不存在则用下一个优先级的值。)
2. viper配置读取的优先级
- Viper将首先检查别名是否存在。
- 然后按默认读取优先级别检查:flag > env > config file, key/value store.
- 最后,如果没有找到值并且flagDefault为true,并且键对应于一个标志,则返回标志的默认值。
go-viper实践相关推荐
- Golang 项目配置文件读取之 viper 实践
Golang 项目配置文件读取之 viper 实践 在我们做一个工程化项目的时候,经常涉及到配置文件的读取,viper 包很好地满足这一需求,而且在 Golang 生态中是流行度最高的.导入方式: i ...
- iOS VIPER架构实践(三):面向接口的路由设计
路由是实现模块间解耦的一个有效工具.如果要进行组件化开发,路由是必不可少的一部分.目前iOS上绝大部分的路由工具都是基于URL匹配的,优缺点都很明显.这篇文章里将会给出一个更加原生和安全的设计,这个设 ...
- VIPER 和 MVVM 到底有什么区别
这篇博客主要的内容是译自Göksel Köksal 的Blurring the Lines Between MVVM and VIPER (本文已获得作者的授权翻译),我把自己对于业务架构模式观点放在 ...
- Grpc+Grpc Gateway实践二 有些复杂的Hello World
Hello World 在上一节中我们已经完成了对环境的基本配置 这节将开始编写一个复杂的Hello World,涉及到许多的知识,建议大家认真思考其中的概念 需求 由于本实践偏向Grpc+Grpc ...
- 用VIPER构建iOS应用
为避免撕逼,提前声明:本文纯属翻译,仅仅是为了学习,加上水平有限,见谅! [原文]https://www.objc.io/issues/13-architecture/singletons/ 用VIP ...
- iOS VIPER架构(三)
路由是实现模块间解耦的一个有效工具.如果要进行组件化开发,路由是必不可少的一部分.目前iOS上绝大部分的路由工具都是基于URL匹配的,优缺点都很明显.这篇文章里将会给出一个更加原生和安全的设计,这个设 ...
- Golang实践录:命令行cobra库实例
本文使用 cobra 库实现一个命令行工具,类似 git.docker.kubectl 这类的工具. 本文仅为一个初具模型的示例,但有实践参考意义. 起因 在编程中,很多时候,程序都会处理多个参数,特 ...
- iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构
2019独角兽企业重金招聘Python工程师标准>>> 本文由CocoaChina译者lynulzy(社区ID)翻译 作者:Bohdan Orlov 原文:iOS Architect ...
- 最佳实践(2):iOS开发篇
本文由 伯乐在线 - 戴仓薯 翻译,dopcn 校稿.未经许可,禁止转载! 英文出处:futurice.欢迎加入翻译组. 这份文档就像软件项目一样,如果我们不维护它就会逐渐腐坏.欢迎大家跟我们一起来维 ...
最新文章
- android服务重启间隔,android – 崩溃的服务在很长一段时间后重新启动
- Dubbo发展史谁知道?
- 关于项目过程能力基线的几个讨论
- ObjecT4:On-line multiple instance learning (MIL)学习
- SAP Spartacus服务器端渲染模式下的调试方法
- 纯ajax html网页,JavaScript – 页面加载纯HTML AJAX网站中的替代品
- kvm虚拟机_关于虚拟机管理KVM,基本操作都在这里,懒人必备,拿去收藏
- 网易考拉向欧洲市场投入220亿,能掀起多大波澜?
- 2015 年五大移动端设计趋势
- survival | 生存分析(5):加速失效时间模型(Accelerated Failure Time Model)
- 三款主流数码绘画软件调研分析
- 2.vulnhub-Xerxes靶机复现
- PXE高效批量网络装机
- 织梦DedeCMS管理员动态密码登录插件下载
- telnet ip地址报接口23连接失败。
- java的 finalize() 方法
- 【Ubuntu18.04 无法找到终端 ifconfig 命令】
- windows11 第三方 截图工具对比
- 三级分销如何合规分账?
- C++刷过的笔试题知识点