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显式设置的>命令行选项传入的>环境变量>配置文件>默认值;

总结

初始化:

  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. JS控制元素的显示和隐藏

    利用来JS控制页面控件显示和隐藏有两种方法,两种方法分别利用HTML的style中的两个属性,两种方法的不同之处在于控件隐藏后是否还在页面上占空位. 方法一: document.getElementB ...

  2. Web安全学习二

    目录 常见漏洞攻防 SQL注入 注入分类 按技巧分类 按获取数据的方式分类 注入检测 权限提升 数据库检测 绕过技巧 CheatSheet SQL Server Payload MySQL Paylo ...

  3. oracle中分组中的ROLLUP和CUBE选项

    在进行多列分组统计时,如果直接使用GROUP BY子句指定分组列,则只能生成基于所有分组列的统计结果.如果在GROUP BY子句中使用ROLLUP语句或CUBE语句,除了生成基于所有指定列的分组统计外 ...

  4. 【Spring Framework】Spring IOC详解及Bean生命周期详细过程

    Spring IOC 首先,在此之前,我们就必须先知道什么是ioc,ioc叫做控制反转,也可以称为依赖注入(DI),实际上依赖注入是ioc的另一种说法, 1.谁控制谁?: 在以前,对象的创建和销毁都是 ...

  5. 【Java基础】transient关键字

    1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过 ...

  6. 使用ajax对用户注册时,用户名进行检验

    package cn.hopetesting.com.servlet;import com.fasterxml.jackson.databind.ObjectMapper;import javax.p ...

  7. 【前端】关于DOM节点

    参考这个: https://juejin.cn/post/6844903849614901261 DOM树的根节点是document对象 DOM节点类型:HTML元素节点(element nodes) ...

  8. Flink Exactly-once 实现原理解析

    关注公众号:大数据技术派,回复"资料",领取1024G资料. 这一课时我们将讲解 Flink "精确一次"的语义实现原理,同时这也是面试的必考点. Flink ...

  9. react原理分析--this.state修改引起的重新渲染

    整理向,非原创,目的是整理出浅显易懂的方向性说明. 比如现有 this.state={name:"小明",age:18} 我们说修改组件的状态要用this.setState()来实 ...

  10. 批处理文件 .bat 并行Arcpy脚本提高效率的思路-提升版

    目录 前言 Arcpy脚本 导入库 函数定义 循环实现 批处理(.bat)脚本 前言 我在之前的博客园博客里,阐述了如何编写Arcpy脚本,如何利用Windows bat批处理脚本同时打开多个cmd窗 ...