Golang项目的配置管理——Viper简易入门配置
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
go get github.com/spf13/viper
Example
初始化:
package settings
import (
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
//初始化一个viper配置
func Init() (err error) {
//制定配置文件的路径
viper.SetConfigFile("conf/config.yaml")
// 读取配置信息
err = viper.ReadInConfig()
if err != nil {
// 读取配置信息失败
fmt.Printf("viper.ReadInConfig()failed,err:%v\n", err)
return
}
//监听修改
viper.WatchConfig()
//为配置修改增加一个回调函数
viper.OnConfigChange(func(in fsnotify.Event) {
fmt.Println("配置文件修改了...")
})
return
}
配置文件示例(yaml):
mysql:
host: "127.0.0.1"
port: 3306
user: "root"
password: "123456"
dbname: "web_app"
max_open_conns: 200
max_idle_conns: 50
redis:
host: "127.0.0.1"
port: 6379
db: 0
password: ""
pool_size: 100
取配置:
package mysql
//省略package
func Init() (err error) {
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True",
viper.GetString("mysql.user"),
viper.GetString("mysql.password"),
viper.GetString("mysql.host"),
viper.GetInt("mysql.port"),
viper.GetString("mysql.dbname"),
)
db, err = sqlx.Connect("mysql", dsn)
db.SetMaxOpenConns(viper.GetInt("mysql.max_open_conns"))
db.SetMaxIdleConns(viper.GetInt("mysql.max_idle_conns"))
return
}
// @version 1.0
程序内显示声明配置:
如果某个键通过viper.Set
设置了值,那么这个值的优先级最高。如:
viper.Set("redis.port", 9000)
此时redis的接口就不是配置文件中设置的6379,而是后面配置的9000
命令行选项:
func init() {
pflag.Int("redis.port", 9001, "Redis port to connect")
// 绑定命令行
viper.BindPFlags(pflag.CommandLine)
}
代码运行时传入参数:$ ./main.exe --redis.port 9001
此时程序配置的redis端口为:9001。
如果我们不传入参数直接执行$ ./main.exe
此时程序配置的redis端口为配置文件中的6379(没有在程序中显示声明配置时viper.Set("redis.port", 9000)
)。
环境变量:
func init() {
// 绑定环境变量
viper.AutomaticEnv()
}
在没有于前面的方法中取得配置的情况下,则会绑定环境变量。
也可以指定绑定对应的环境变量:
func init() {
// 绑定环境变量
viper.BindEnv("redis.port")
viper.BindEnv("go.path", "GOPATH")
}
BindEnv()
如果只传入一个参数,则这个参数既表示键名,又表示环境变量名。如果传入两个参数,则第一个参数表示键名,第二个参数表示环境变量名。
也可以通过viper.SetEnvPrefix()
设置环境变量前缀,设置后前面的方法会为传入的值加上变量后再去查找环境变量。
- 默认值可以调用
viper.SetDefault
设置。
总结优先级:
调用Set
显式设置的>命令行选项传入的>环境变量>配置文件>默认值;
总结
初始化:
- 设置配置文件路径
viper.SetConfigFile()
- 读取配置
viper.ReadInConfig()
- 监听修改
viper.WatchConfig()
- 设置修改后回调
viper.OnConfigChange(func())
调用:
取配置viper.Get*()
设置优先级:
声明调用Set
显式设置的>命令行选项传入的>环境变量>配置文件>默认值;
我的个人站:mrxuexi.com
Golang项目的配置管理——Viper简易入门配置的更多相关文章
- Emacs中多个golang项目的配置方法
概述 最近使用golang开发项目时, 发现有时需要同时进行多个golang项目. 在这种情况下, 如果把所有的项目都放在 GOPATH 之下, 不仅管理麻烦(因为各个项目需要提交到不同的代码库), ...
- 01-项目简介Springboot简介入门配置项目准备
总体课程主要分为4个阶段课程: ------------------------课程介绍------------------------ 01-项目简介Springboot简介入门配置项目准备02-M ...
- SpringMVC框架入门配置 IDEA下搭建Maven项目(zz)
SpringMVC框架入门配置 IDEA下搭建Maven项目 这个不错哦 http://www.cnblogs.com/qixiaoyizhan/p/5819392.html
- Golang 入门 : 配置代理
由于一些客观原因的存在,我们开发 Golang 项目的过程总会碰到无法下载某些依赖包的问题.这不是一个小问题,因为你的工作会被打断,即便你使用各种神通解决了问题,很可能这时你的线程已经切换到其他的事情 ...
- JNI简易入门
JNI简介 JNI(Java Native Interface)是JDK的一部分,提供了若干API实现了Java和其他语言的通信(主要是C/C++).JNI主要用于以下场景: 贴近硬件底层的功能,Ja ...
- 项目自动化建构工具gradle 入门5——在intellij中做一个gradle的web工程
之前的几个小节,都是纯手工建文件夹,纯手工拷贝war包,或者纯手工解压个zip看看结果,,,,这还是我写了玩的helloWorld.若是玩大工程.几十个人的团队协同开发时,这么玩,,,,暴躁的程序员估 ...
- 项目自动化建构工具gradle 入门2——log4j输出helloWorld
上一章节呢,有一个能跑的程序了.但是对做工程的人来说,用日志输出感觉比用System.out要有档次一点.比如使用log4j.直接上例子: 1进入D:\work\gradle\log目录 ,您电脑没 ...
- 大型项目使用Automake/Autoconf完成编译配置
http://www.cnblogs.com/xf-linux-arm-java-android/p/3590770.htmlhttp://blog.csdn.net/zengraoli/articl ...
- .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了
作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新 ...
随机推荐
- Vue相关,Vue生命周期及对应的行为
先来一张经典图 生命钩子函数 使用vue的朋友们知道,生命周期函数长这样- mounted: function() { } // 或者 mounted() { } 注意点,Vue的所有生命周期函数都是 ...
- STM32代码常见的坑
1 混淆换行符\和除号/造成的坑 入坑代码: GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin ...
- Stream collect Collectors 常用详细实例
返回List集合: toList() 用于将元素累积到List集合中.它将创建一个新List集合(不会更改当前集合). List<Integer> integers = Arrays.as ...
- Java事务与JTA
一.什么是JAVA事务 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令.更简答的说就是:要么 ...
- 【力扣】973. 最接近原点的 K 个点
我们有一个由平面上的点组成的列表 points.需要从中找出 K 个距离原点 (0, 0) 最近的点. (这里,平面上两点之间的距离是欧几里德距离.) 你可以按任何顺序返回答案.除了点坐标的顺序之外, ...
- 『与善仁』Appium基础 — 23、操作滑动的方式
目录 1.swipe滑动 2.scroll滑动 3.drag拖拽事件 4.滑动方法小结 5.拓展:多次滑动 6.综合练习 在Appium中提供了三种滑动的方式,swipe滑动.scroll滑动.dra ...
- Java中方法和类的深入分析
1.构造方法不能被继承.也就是说子类里没有父类的构造方法. Java重载根据的是实参和方法形参之间的匹配.自动类型转换也在重载版本的判断中起到了作用.重载的价值在于允许使用通用名称访问相关的方法. ...
- shell脚本 检查mysql节点数据一致性
一.简介 源码地址 日期:2018/4/12 介绍:参考pt checksum思想改写,可以定制化的检查随意两个mysql节点的数据一致性. 功能: 检查随意两个几点的数据一致性 支持并发检查,基于库 ...
- gitlab 备份&恢复
Gitlab 成功运行起来之后,最终的事情就是定期的备份,遇到问题后的还原. 备份配置 默认 Gitlab 的备份文件会创建在/var/opt/gitlab/backups文件夹中,格式为时间戳_日期 ...
- Windows下安装xampp的PHP扩展(redis为例)
(1)PHP的windowns扩展下载网址:https://windows.php.net/downloads/pecl/releases/ (2)Ctrl+f查询你要下载的扩展名 注意:扩展的版本要 ...