一、需求

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 思路

  1. 从yaml中读取配置,主要是为了序列化出要用到的参数。
  2. 使用v.AutomaticEnv(),自动加载出环境变量到viper。
  3. 将环境变量替换成掉yaml中读取的值。(注意:LoopEnv 环境变量如果存在就返回,如果不存在则用下一个优先级的值。)

2. viper配置读取的优先级

  1. Viper将首先检查别名是否存在。
  2. 然后按默认读取优先级别检查:flag > env > config file, key/value store.
  3. 最后,如果没有找到值并且flagDefault为true,并且键对应于一个标志,则返回标志的默认值。

go-viper实践相关推荐

  1. Golang 项目配置文件读取之 viper 实践

    Golang 项目配置文件读取之 viper 实践 在我们做一个工程化项目的时候,经常涉及到配置文件的读取,viper 包很好地满足这一需求,而且在 Golang 生态中是流行度最高的.导入方式: i ...

  2. iOS VIPER架构实践(三):面向接口的路由设计

    路由是实现模块间解耦的一个有效工具.如果要进行组件化开发,路由是必不可少的一部分.目前iOS上绝大部分的路由工具都是基于URL匹配的,优缺点都很明显.这篇文章里将会给出一个更加原生和安全的设计,这个设 ...

  3. VIPER 和 MVVM 到底有什么区别

    这篇博客主要的内容是译自Göksel Köksal 的Blurring the Lines Between MVVM and VIPER (本文已获得作者的授权翻译),我把自己对于业务架构模式观点放在 ...

  4. Grpc+Grpc Gateway实践二 有些复杂的Hello World

    Hello World 在上一节中我们已经完成了对环境的基本配置 这节将开始编写一个复杂的Hello World,涉及到许多的知识,建议大家认真思考其中的概念 需求 由于本实践偏向Grpc+Grpc ...

  5. 用VIPER构建iOS应用

    为避免撕逼,提前声明:本文纯属翻译,仅仅是为了学习,加上水平有限,见谅! [原文]https://www.objc.io/issues/13-architecture/singletons/ 用VIP ...

  6. iOS VIPER架构(三)

    路由是实现模块间解耦的一个有效工具.如果要进行组件化开发,路由是必不可少的一部分.目前iOS上绝大部分的路由工具都是基于URL匹配的,优缺点都很明显.这篇文章里将会给出一个更加原生和安全的设计,这个设 ...

  7. Golang实践录:命令行cobra库实例

    本文使用 cobra 库实现一个命令行工具,类似 git.docker.kubectl 这类的工具. 本文仅为一个初具模型的示例,但有实践参考意义. 起因 在编程中,很多时候,程序都会处理多个参数,特 ...

  8. iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构

    2019独角兽企业重金招聘Python工程师标准>>> 本文由CocoaChina译者lynulzy(社区ID)翻译 作者:Bohdan Orlov 原文:iOS Architect ...

  9. 最佳实践(2):iOS开发篇

    本文由 伯乐在线 - 戴仓薯 翻译,dopcn 校稿.未经许可,禁止转载! 英文出处:futurice.欢迎加入翻译组. 这份文档就像软件项目一样,如果我们不维护它就会逐渐腐坏.欢迎大家跟我们一起来维 ...

最新文章

  1. android服务重启间隔,android – 崩溃的服务在很长一段时间后重新启动
  2. Dubbo发展史谁知道?
  3. 关于项目过程能力基线的几个讨论
  4. ObjecT4:On-line multiple instance learning (MIL)学习
  5. SAP Spartacus服务器端渲染模式下的调试方法
  6. 纯ajax html网页,JavaScript – 页面加载纯HTML AJAX网站中的替代品
  7. kvm虚拟机_关于虚拟机管理KVM,基本操作都在这里,懒人必备,拿去收藏
  8. 网易考拉向欧洲市场投入220亿,能掀起多大波澜?
  9. 2015 年五大移动端设计趋势
  10. survival | 生存分析(5):加速失效时间模型(Accelerated Failure Time Model)
  11. 三款主流数码绘画软件调研分析
  12. 2.vulnhub-Xerxes靶机复现
  13. PXE高效批量网络装机
  14. 织梦DedeCMS管理员动态密码登录插件下载
  15. telnet ip地址报接口23连接失败。
  16. java的 finalize() 方法
  17. 【Ubuntu18.04 无法找到终端 ifconfig 命令】
  18. windows11 第三方 截图工具对比
  19. 三级分销如何合规分账?
  20. C++刷过的笔试题知识点

热门文章

  1. 体育、医药、股票思维导图模板
  2. 江湖云RFID电子标签在珠宝行业的应用
  3. 如何用自己电脑架设服务器
  4. Docker将会在Windows和MAC平台本地化
  5. python延时函数 微秒_Python程序可显示当前时,分,秒和微秒
  6. 蜻蜓特派员 Windows XP SP3 纯净终结版
  7. 51单片机 16X16点阵循环滚动显示汉字(基于proteus)
  8. UE4 循环滚动Led效果材质
  9. ae计算机配置要求,CG馒头分享AE cs6对电脑所需配置需求
  10. 多模态理论张德禄_学术会议 | 适用语言学与多模态国际会议