viper简介

Viper是适用于Go应用程序的完整配置解决方案。它旨在在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持:

设置默认值

从JSON,TOML,YAML,HCL,envfile和Java属性配置文件中读取

实时观看和重新读取配置文件(可选)

从环境变量中读取

从远程配置系统(etcd或Consul)中读取,并观察更改

从命令行标志读取

从缓冲区读取

设置显式值

可以将Viper视为满足您所有应用程序配置需求的注册表。

加载配置优先级

Viper会按照下面的优先级。每个项目的优先级都高于它下面的项目:

显示调用Set设置值

命令行参数(flag)

环境变量

配置文件

key/value存储

默认值

目录结构

config.yaml

db:
username: mayanan
password: 123456789
host: 123.123.12.123
port: 33066
database: docker01
v: 88.88 # 将会覆盖: v.SetDefault("V", "1.11") // 建立默认值
version: 99.99

config.go

package config

import (
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
"os"
) func LoadConfigFromYaml() (v *viper.Viper, err error) {
v = viper.New()
v.SetConfigName("config.yaml")
v.AddConfigPath("./config/")
v.SetConfigType("yaml")
v.Set("version", "2.22") // 显示调用Set设置值
v.SetDefault("V", "1.11") // 建立默认值 // viper从环境变量读取
v.SetEnvPrefix("spf")
v.BindEnv("id")
os.Setenv("spf_id", "111") if err = v.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
// Config file not found; ignore error if desired
fmt.Println("Config file not found; ignore error if desired")
} else {
// Config file was found but another error was produced
fmt.Println("Config file was found but another error was produced")
}
} // 监控配置和重新获取配置
v.WatchConfig() v.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("Config file changed:", e.Name)
})
return v, err
}

main.go

package main

import (
"fmt"
"github.com/gin-gonic/gin"
"viperTest/config"
) func main() {
router := gin.Default()
v, _ := config.LoadConfigFromYaml()
router.GET("/", func(context *gin.Context) {
context.JSON(200, gin.H{
"config": v.AllSettings(),
})
fmt.Println(v.GetString("db.password"), v.Get("id")) // 获取单个配置属性
})
router.Run("127.0.0.1:8899")
}

获取值

在Viper中,根据值的类型,有几种获取值的方法。存在以下功能和方法:

Get(key string) : interface{}
GetBool(key string) : bool
GetFloat64(key string) : float64
GetInt(key string) : int
GetIntSlice(key string) : []int
GetString(key string) : string
GetStringMap(key string) : map[string]interface{}
GetStringMapString(key string) : map[string]string
GetStringSlice(key string) : []string
GetTime(key string) : time.Time
GetDuration(key string) : time.Duration
IsSet(key string) : bool
AllSettings() : map[string]interface{}

postman请求接口

http://127.0.0.1:8899

响应:

{
"config": {
"db": {
"database": "docker01",
"host": "123.123.12.123",
"password": 123456,
"port": 33066,
"username": "mayanan"
},
"v": "1.11",
"version": "2.22"
}
}

此时把config.yaml中的内容改一下,再次请求接口,响应发生变化,根本不用重启我们的应用程序,非常的友好

写入配置文件

从配置文件中读取配置文件是有用的,但是有时你想要存储在运行时所做的所有修改。为此,可以使用下面一组命令,每个命令都有自己的用途:

WriteConfig - 将当前的viper配置写入预定义的路径并覆盖(如果存在的话)。如果没有预定义的路径,则报错。

SafeWriteConfig - 将当前的viper配置写入预定义的路径。如果没有预定义的路径,则报错。如果存在,将不会覆盖当前的配置文件。

WriteConfigAs - 将当前的viper配置写入给定的文件路径。将覆盖给定的文件(如果它存在的话)。

SafeWriteConfigAs - 将当前的viper配置写入给定的文件路径。不会覆盖给定的文件(如果它存在的话)。

根据经验,标记为safe的所有方法都不会覆盖任何文件,而是直接创建(如果不存在),而默认行为是创建或截断。

小示例:

viper.WriteConfig() // 将当前配置写入“viper.AddConfigPath()”和“viper.SetConfigName”设置的预定义路径
viper.SafeWriteConfig()
viper.WriteConfigAs("/path/to/my/.config")
viper.SafeWriteConfigAs("/path/to/my/.config") // 因为该配置文件写入过,所以会报错
viper.SafeWriteConfigAs("/path/to/my/.other_config")

viper中使用环境变量

Viper 完全支持环境变量。这使得12因素的应用程序开箱即用。有五种方法可以帮助与 ENV 合作:

AutomaticEnv()  // 可以通过v读取:v.Get("id")
BindEnv(string...) : error // 绑定到viper中,既可以通过v读取,也可以通过v拿到配置
SetEnvPrefix(string)
SetEnvKeyReplacer(string...) *strings.Replacer
AllowEmptyEnv(bool)

viper简介

github.com/spf13/viper

golang中的配置管理库viper的更多相关文章

  1. golang中的标准库context解读

    简介 golang 中的创建一个新的 goroutine , 并不会返回像c语言类似的pid,所有我们不能从外部杀死某个goroutine,所有我就得让它自己结束,之前我们用 channel + se ...

  2. golang中的标准库数据格式

    数据格式介绍 是系统中数据交互不可缺少的内容 这里主要介绍JSON.XML.MSGPack JSON json是完全独立于语言的文本格式,是k-v的形式 name:zs 应用场景:前后端交互,系统间数 ...

  3. golang中的标准库context

    在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理.请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务.用来处理一个请 ...

  4. golang中的标准库template

    html/template包实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出.它提供了和text/template包相同的接口,Go语言中输出HTML的场景都应使用text/templa ...

  5. golang中的标准库log

    Go语言内置的log包实现了简单的日志服务.本文介绍了标准库log的基本使用. 使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法.本包也提供了一个预定义的" ...

  6. golang中的标准库反射

    反射 反射是指程序在运行期对程序本身访问和修改的能力 变量的内在机制 变量包含类型信息和值信息 var arr [10]int arr[0] = 10 类型信息:是静态的元信息,是预先定义好的 值信息 ...

  7. golang中的标准库http

    Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现. http客户端 基本的HTTP/HTTPS请求 Get.Head.Post和PostForm函数发出HTTP/HTTP ...

  8. golang中的标准库strconv

    strconv 包 strconv包实现了基本数据类型与其字符串表示的转换,主要有以下常用函数: Atoi().Itia().parse系列.format系列.append系列. string与int ...

  9. golang中的标准库IO操作

    参考链接 输入输出的底层原理 终端其实是一个文件,相关实例如下: os.Stdin:标准输入的文件实例,类型为*File os.Stdout:标准输出的文件实例,类型为*File os.Stderr: ...

随机推荐

  1. 【LeetCode】27. Remove Element 解题报告(Python & Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 记录起始位置 日期 题目地址:https:/ ...

  2. 【LeetCode】950. Reveal Cards In Increasing Order 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 模拟 日期 题目地址:https://leetcod ...

  3. 【LeetCode】944. Delete Columns to Make Sorted 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  4. 【LeetCode】703. Kth Largest Element in a Stream 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 小根堆 日期 题目地址:https://leetco ...

  5. (4329)Ping pong

    思路:树状数组. 考虑第i个人当裁判,那么只要计算出在他之前比他小的乘在他之后比他大的与在他之前比他大的乘在他之后比他小的,那么用两个树状数组维护一下就行了.复杂的(n*log(n)) 1 #incl ...

  6. 1036 - A Refining Company

    1036 - A Refining Company   PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 32 ...

  7. [数据结果]C语言 基础指令汇编

    数据结构 C语言核心操作集合 (1)预定义常量和类型 //函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #d ...

  8. Java初学者作业——分别计算两个整数加、减、乘、除的结果并显示,要求除法保留两位小数。

    返回本章节 返回作业目录 需求说明: 分别计算两个整数加.减.乘.除的结果并显示,要求除法保留两位小数. 实现思路: 接收用户控制台输入的两个整数. 实现两个整数的加.减.乘.除的运算并输出结果. 除 ...

  9. SpringBoot集成MyBatis-Plus代码生成器(Dao)

    1.说明 本文基于SpringBoot集成MyBatis-Plus代码生成器, 把原来生成Entity.Mapper.Mapper XML.Service.Controller等各个模块的代码, 修改 ...

  10. shell2-if判断

    1.条件测试类型(判断类型): 将测试结果做为判断依据. 测试类型有以下三种   [ 命令 ] :命令测试法(最常用的)  [[ 命令 ]] : 关键字测试 test 命令 以上是三种都可以,注意单词 ...