Golang项目的配置管理——Viper简易入门配置

What is Viper?

From:https://github.com/spf13/viper

Viper is a complete configuration solution for Go applications including 12-Factor apps.

(VIPER是实现遵循12-Factor的GO应用程序的完整配置解决方案)

它支持:

  • 支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多种格式的配置文件

  • 实时监控及重载配置文件(可选)

  • 从环境变量、命令行标记、缓存中读取配置;

  • 从远程配置系统中读取和监听修改,如 etcd/Consul;

  • 显式设置键值。

Why Viper?

When building a modern application, you don’t want to worry about configuration file formats; you want to focus on building awesome software. Viper is here to help with that.

(构建现代应用程序时,你不想去过多关注配置文件的格式,你想专注于建立更棒的软件,Viper可以帮助你)

Install

  1. go get github.com/spf13/viper

Example

初始化:

  1. package settings
  2. import (
  3. "fmt"
  4. "github.com/fsnotify/fsnotify"
  5. "github.com/spf13/viper"
  6. )
  7. //初始化一个viper配置
  8. func Init() (err error) {
  9. //制定配置文件的路径
  10. viper.SetConfigFile("conf/config.yaml")
  11. // 读取配置信息
  12. err = viper.ReadInConfig()
  13. if err != nil {
  14. // 读取配置信息失败
  15. fmt.Printf("viper.ReadInConfig()failed,err:%v\n", err)
  16. return
  17. }
  18. //监听修改
  19. viper.WatchConfig()
  20. //为配置修改增加一个回调函数
  21. viper.OnConfigChange(func(in fsnotify.Event) {
  22. fmt.Println("配置文件修改了...")
  23. })
  24. return
  25. }

配置文件示例(yaml):

  1. mysql:
  2. host: "127.0.0.1"
  3. port: 3306
  4. user: "root"
  5. password: "123456"
  6. dbname: "web_app"
  7. max_open_conns: 200
  8. max_idle_conns: 50
  9. redis:
  10. host: "127.0.0.1"
  11. port: 6379
  12. db: 0
  13. password: ""
  14. pool_size: 100

取配置:

  1. package mysql
  2. //省略package
  3. func Init() (err error) {
  4. dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True",
  5. viper.GetString("mysql.user"),
  6. viper.GetString("mysql.password"),
  7. viper.GetString("mysql.host"),
  8. viper.GetInt("mysql.port"),
  9. viper.GetString("mysql.dbname"),
  10. )
  11. db, err = sqlx.Connect("mysql", dsn)
  12. db.SetMaxOpenConns(viper.GetInt("mysql.max_open_conns"))
  13. db.SetMaxIdleConns(viper.GetInt("mysql.max_idle_conns"))
  14. return
  15. }
  16. // @version 1.0

程序内显示声明配置:

如果某个键通过viper.Set设置了值,那么这个值的优先级最高。如:

  1. viper.Set("redis.port", 9000)

此时redis的接口就不是配置文件中设置的6379,而是后面配置的9000

命令行选项:

  1. func init() {
  2. pflag.Int("redis.port", 9001, "Redis port to connect")
  3. // 绑定命令行
  4. viper.BindPFlags(pflag.CommandLine)
  5. }

代码运行时传入参数:$ ./main.exe --redis.port 9001

此时程序配置的redis端口为:9001。

如果我们不传入参数直接执行$ ./main.exe

此时程序配置的redis端口为配置文件中的6379(没有在程序中显示声明配置时viper.Set("redis.port", 9000))。

环境变量:

  1. func init() {
  2. // 绑定环境变量
  3. viper.AutomaticEnv()
  4. }

在没有于前面的方法中取得配置的情况下,则会绑定环境变量。

也可以指定绑定对应的环境变量:

  1. func init() {
  2. // 绑定环境变量
  3. viper.BindEnv("redis.port")
  4. viper.BindEnv("go.path", "GOPATH")
  5. }

BindEnv()如果只传入一个参数,则这个参数既表示键名,又表示环境变量名。如果传入两个参数,则第一个参数表示键名,第二个参数表示环境变量名。

也可以通过viper.SetEnvPrefix()设置环境变量前缀,设置后前面的方法会为传入的值加上变量后再去查找环境变量。

  • 默认值可以调用viper.SetDefault设置。

总结优先级:

调用Set显式设置的>命令行选项传入的>环境变量>配置文件>默认值;

总结

初始化:

  1. 设置配置文件路径viper.SetConfigFile()
  2. 读取配置viper.ReadInConfig()
  3. 监听修改viper.WatchConfig()
  4. 设置修改后回调viper.OnConfigChange(func())

调用:

​ 取配置viper.Get*()

设置优先级:

声明调用Set显式设置的>命令行选项传入的>环境变量>配置文件>默认值;

我的个人站:mrxuexi.com

Golang项目的配置管理——Viper简易入门配置的更多相关文章

  1. Emacs中多个golang项目的配置方法

    概述 最近使用golang开发项目时, 发现有时需要同时进行多个golang项目. 在这种情况下, 如果把所有的项目都放在 GOPATH 之下, 不仅管理麻烦(因为各个项目需要提交到不同的代码库), ...

  2. 01-项目简介Springboot简介入门配置项目准备

    总体课程主要分为4个阶段课程: ------------------------课程介绍------------------------ 01-项目简介Springboot简介入门配置项目准备02-M ...

  3. SpringMVC框架入门配置 IDEA下搭建Maven项目(zz)

    SpringMVC框架入门配置 IDEA下搭建Maven项目 这个不错哦 http://www.cnblogs.com/qixiaoyizhan/p/5819392.html

  4. Golang 入门 : 配置代理

    由于一些客观原因的存在,我们开发 Golang 项目的过程总会碰到无法下载某些依赖包的问题.这不是一个小问题,因为你的工作会被打断,即便你使用各种神通解决了问题,很可能这时你的线程已经切换到其他的事情 ...

  5. JNI简易入门

    JNI简介 JNI(Java Native Interface)是JDK的一部分,提供了若干API实现了Java和其他语言的通信(主要是C/C++).JNI主要用于以下场景: 贴近硬件底层的功能,Ja ...

  6. 项目自动化建构工具gradle 入门5——在intellij中做一个gradle的web工程

    之前的几个小节,都是纯手工建文件夹,纯手工拷贝war包,或者纯手工解压个zip看看结果,,,,这还是我写了玩的helloWorld.若是玩大工程.几十个人的团队协同开发时,这么玩,,,,暴躁的程序员估 ...

  7. 项目自动化建构工具gradle 入门2——log4j输出helloWorld

    上一章节呢,有一个能跑的程序了.但是对做工程的人来说,用日志输出感觉比用System.out要有档次一点.比如使用log4j.直接上例子: 1进入D:\work\gradle\log目录  ,您电脑没 ...

  8. 大型项目使用Automake/Autoconf完成编译配置

    http://www.cnblogs.com/xf-linux-arm-java-android/p/3590770.htmlhttp://blog.csdn.net/zengraoli/articl ...

  9. .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新 ...

随机推荐

  1. Shell学习(五)—— awk命令详解

    一.awk简介   awk是一个非常好用的数据处理工具,相对于sed常常作用于一整个行的处理,awk则比较倾向于一行当中分成数个[字段]处理,因此,awk相当适合处理小型的数据数据处理.awk是一种报 ...

  2. 如果你不想让pthread_join阻塞你的进程,那么请调用pthread_detach

    如果你不想让pthread_join阻塞你的进程,那么请调用pthread_detach 2016年01月13日 16:04:20 炸鸡叔 阅读数:7277   转发自:http://baike.ba ...

  3. 1.RabbitMQ

    1.RabbitMq是什么?    MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队 ...

  4. ssm中的注解

    1.@Controller 2.@RequestMapping 3.@RequestParam public String getUser(HttpSession session,@RequestPa ...

  5. 【C#】【MySQL】【GridView】删除出现Parameter index is out of range

    [编程语言]C# [数据库]MySQL [控件]GridView [问题描述]GridView控件中自带[删除],[编辑],[选择],三个按钮[编辑],[选择]正常使用,但是在使用删除时,却报错Par ...

  6. 从一次解决Nancy参数绑定“bug”开始发布自己的第一个nuget包(上篇)

    起因 最近,同事跟我说,他们负责的一个Api程序出现了一些很奇怪的事情.这个Api是为环保局做的一个扬尘质控大屏提供数据的,底层是基于Nancy做的.因为发现有些接口的数据出现异常,他就去调试了一下, ...

  7. 微信小程序第一步

    微信小程序开发文档https://developers.weixin.qq.com/miniprogram/dev/#小程序简介

  8. 果蝇优化算法_Fruit Fly Optimization

    1. 果蝇优化算法背景 在夏天,果蝇是一种随处可见的昆虫.果蝇在嗅觉和视觉特别突出.腐烂的食物发出一种刺鼻的味道,温度越高这种气味的扩散速度较快,果蝇对这种味道非常敏感.腐烂的味道和食物的位置有关.一 ...

  9. 虎符2021线下赛pwn writeup

    jdt 一个图书管理系统,但并不是常规的堆题.edit和show函数可以越界.edit函数和show函数相互配合泄露libc基地址,将main函数的返回地址覆盖成onegadgets拿shell. f ...

  10. [BUUCTF]REVERSE——[WUSTCTF2020]level3

    [WUSTCTF2020]level3 附件 步骤: 例行检查,64位程序,无壳 64位ida载入,找到关键函数 看样子是个base64加密,但又感觉没那么简单,再翻翻左边的函数,找到了base64加 ...