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

总结

初始化:

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

调用:

​ 取配置 viper.Get*()

设置优先级:

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

我的个人站:mrxuexi.com

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

Original: https://www.cnblogs.com/Mrxuexi/p/15750455.html
Author: Mrxuexi
Title: Golang项目的配置管理——Viper简易入门配置

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516480/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Go语言程序记录日志

    许多软件系统运行中需要日志文件。Go语言程序中,输出日志需要使用包”log”,编写程序十分简单。 像Java语言程序,输出日志时,往往需要使用开源的软件包来…

    Go语言 2023年5月29日
    037
  • 基于LSM的Key-Value数据库实现稀疏索引篇

    上篇文章简单的填了一个坑基于LSM数据库的实现了WAL,在该版本中如数据写入到内存表的同时将未持久化的数据写入到WAL文件,在未将数据持久化时程序崩溃,可通过WAL文件将数据还原恢…

    Go语言 2023年5月25日
    074
  • golang 中 sync.Mutex 的实现

    mutex 主要有两个 method: Lock() 和 Unlock() Lock() 可以通过一个 CAS 操作来实现 func (m *Mutex) Lock() { for…

    Go语言 2023年5月25日
    055
  • golang初探

    最近两天对go语言做了一个初步的了解,记录一下。之前没有按照原创发表,所以重新发布一次。 第一个感受就是使用起来方便,从官网下载安装包,参考https://golang.googl…

    Go语言 2023年5月25日
    071
  • Go Error 嵌套到底是怎么实现的?

    原文链接: Go Error 嵌套到底是怎么实现的? Go Error 的设计哲学是 「Errors Are Values」。 这句话应该怎么理解呢?翻译起来挺难的。不过从源码的角…

    Go语言 2023年5月25日
    063
  • Ebiten-纯Golang开发的跨平台游戏引擎

    Go语言不是让你玩的啊喂! 昨天跟好基友聊开发的事,他说他等着闲下来的时候就用 PYGame写个像那个最近挺火的”文X游X”一样的游戏.(没收广告费啊!) …

    Go语言 2023年5月25日
    076
  • Sentinel-Go 源码系列(一)|开篇

    大家好呀,打算写一个 Go 语言组件源码分析系列,一是为了能学习下 Go 语言,看下别人是怎么写 Go 的,二是也掌握一个组件。 本次选择了 Sentinel-Go,一是对 Jav…

    Go语言 2023年5月25日
    061
  • 常见的限流算法

    通过限制并发访问数或者限制一个时间窗口内允许处理的请求数量来保护系统,例如,通过限流,你可以过滤掉产生流量峰值的客户和服务。 令牌桶算法 令牌桶算法是常见的一种限流算法。假设有一个…

    Go语言 2023年5月25日
    051
  • go实用编程-算法篇 -归并排序

    /**** // i: the begin index of old sub-array, j: the begin index of even sub-array | array…

    Go语言 2023年5月25日
    066
  • 为什么要避免在 Go 中使用 ioutil.ReadAll?

    原文链接: 为什么要避免在 Go 中使用 ioutil.ReadAll? ioutil.ReadAll 主要的作用是从一个 io.Reader 中读取所有数据,直到结尾。 在 Gi…

    Go语言 2023年5月25日
    046
  • Golang使用swaggo自动生成Restful API文档

    相信很多程序猿和我一样不喜欢写API文档。写代码多舒服,写文档不仅要花费大量的时间,有时候还不能做到面面具全。但API文档是必不可少的,相信其重要性就不用我说了,一份含糊的文档甚至…

    Go语言 2023年5月25日
    053
  • Go语言实现线程安全访问队列

    这个例子用Go语言的包”container/list”实现一个线程安全访问的队列。其中不少细节耐人寻味,做出它则是花费了不少精力,找不到样例啊! Go语言的…

    Go语言 2023年5月29日
    045
  • Go语言之高级篇beego框架之controller调用model

    一、controller调用model 开发规范,就该把对数据库的操作写在model文件夹中。 示例: views/main.go routers/router.go models…

    Go语言 2023年5月29日
    061
  • golang实现一个简单的websocket聊天室

    基本原理:1.引入了 golang.org/x/net/websocket 包。2.监听端口。3.客户端连接时,发送结构体: {“type”:”…

    Go语言 2023年5月25日
    063
  • 微服务-限流:一.golang实现令牌桶算法

    起初是因为要去拉取一些第三方的数据,而第三方的API接口都有限流措施。比如6000/分钟,500/分钟。想着拉取数据就用多个协程的方式。但是容易超频,所以想着写一个限流的东东。网上…

    Go语言 2023年5月25日
    044
  • go程序添加远程调用tcpdump功能

    最近开发的telemetry采集系统上线了。听起来高大上,简单来说就是一个grpc/udp服务端,用户的机器(路由器、交换机)将它们的各种统计数据上报采集、整理后交后端的各类AI分…

    Go语言 2023年5月25日
    063
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球