1 介绍

Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。目前Star 26.6k, 它支持以下特性:

  • 设置默认值
  • 从JSON、TOML、YAML、HCL、envfile和Java properties格式的配置文件读取配置信息
  • 实时监控和重新读取配置文件(可选)
  • 从环境变量中读取
  • 从远程配置系统(etcd或Consul)读取并监控配置变化
  • 从命令行参数读取配置
  • 从buffer读取配置
  • 显式配置值

2 Golang项目中的使用

2.1 在go中安装Viper

# 终端中输入如下命令
ArchitePlus@MacBook-Air traffic.demo % go get github.com/spf13/viper

2.2 编写通用配置文件

因为能支持多重配置文件格式,包含 JSON、TOML、YAML、HCL、INI、envfile 和 Java 属性文件,方便开发者根据项目需求选择合适的格式。

我们这边使用yaml做示例。

创建一个conf文件夹,添加子文件夹files,然后在下面添加config.yaml,里面可以放一些基本的、通用的配置信息。

app: # 应用基本配置
env: local # 环境名称
port: 8888 # 服务监听端口号
app_name: traffic-demo # 应用名称
app_url: http://localhost # 应用访问地址 MySQL: # MySQL配置
host: 127.0.0.1 # MySQL主机地址
port: 3306 # MySQL端口号
user: root # MySQL用户名
password: <PASSWORD>
db_name: traffic # MySQL数据库名

可以看到,我们有两个配置信息,一个是 app,一个是MySQL。

2.3 编写用户自定义配置文件

还有一些用户自定义的配置文件(可能有多个), 是需要根据不同的运行环境(local、dev、beta、prod)来进行区分的.所以我们在config/files/下面创建四个文件夹 localdevbetaprod 四个文件夹,每个文件夹都有一个custom.yaml文件,当 app.env 的值变化的时候,读取的文件也跟着变化,下面是local的信息

white_list:
user_id: # 用户列表
- 063105015
- 063105024
- 063105028
request_path: # 访问路径
- /api/v1/users
- /api/v1/ops

2.4 配置映射的结构体

我们需要配置结构体(实体对象)来映射这俩配置,这样的话,后面在调用的时候非常方便。

conf文件夹下面添加子文件夹model,存放解析映射的结构体,这边新增一个config.go和一个custom.go文件,内容如下:

2.4.1 config.go

package config

// 配置文件解析汇总
type Configuration struct {
App App `mapstructure:"app" json:"app" yaml:"app"`
MYSQL MYSQL `mapstructure:"mysql" json:"mysql" yaml:"mysql"`
} // 配置文件解析:app
type App struct {
Env string `mapstructure:"env" json:"env" yaml:"env"`
Port string `mapstructure:"port" json:"port" yaml:"port"`
AppName string `mapstructure:"app_name" json:"app_name" yaml:"app_name"`
AppUrl string `mapstructure:"app_url" json:"app_url" yaml:"app_url"`
} // 配置文件解析:mysql
type MYSQL struct {
Host string `mapstructure:"host" json:"host" yaml:"host"`
Port string `mapstructure:"poet" json:"port" yaml:"port"`
User string `mapstructure:"user" json:"user" yaml:"user"`
Password string `mapstructure:"password" json:"password" yaml:"password"`
DbName string `mapstructure:"db_name" json:"db_name" yaml:"db_name"`
}

2.4.2 custom.go

package config

type Custom struct {
WhiteList whiteList `mapstructure:"white_list" json:"white_list" yaml:"white_list"`
} // 配置文件解析汇总
type whiteList struct {
UserId []string `mapstructure:"user_id" json:"user_id" yaml:"user_id"`
RequestPath []string `mapstructure:"request_path" json:"request_path" yaml:"request_path"`
}

2.5 创建Global全局变量解析

新建一个 global/app.go 文件,定义 Application 结构体,用来存放一些项目启动时的变量,方便调用。

目前先将 viper 结构体和 Configuration 结构体放入,后续会陆续添加其他配置信息。

package global

import (
"github.com/spf13/viper"
config "traffic.demo/config/model"
) // 定义一个全局的Application
type Application struct {
ConfigViper *viper.Viper
Config config.Configuration
Custom config.Custom
} // 初始化Application
var App = new(Application)

2.5 关键步骤:结构体映射逻辑

配置文件要映射到结构体,这样才能把配置数据提取出来,这边创建 bootstrap/config.go 文件,作为核心解析代码的载体,代码如下(代码中的解释已经很清楚了):

package bootstrap

import (
"fmt" "github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
"traffic.demo/global"
) // configAssemble 是一个泛型函数,用于组装配置文件并返回 viper.Viper 指针
//
// 参数:
//
// configPath string - 配置文件路径
// viperStruct T - 用来接收配置文件的结构体
//
// 返回值:
//
// *viper.Viper - viper.Viper 指针
func configAssemble[T any](configPath string, viperStruct T) *viper.Viper {
// 初始化 viper
v := viper.New()
// 配置文件地址
v.SetConfigFile(configPath)
// 配置文件类型,yaml
v.SetConfigType("yaml")
if err := v.ReadInConfig(); err != nil {
panic(fmt.Errorf("read config failed: %s \n", err))
} // 监听配置文件
v.WatchConfig()
v.OnConfigChange(func(in fsnotify.Event) {
fmt.Println("config file changed:", in.Name)
// 重载配置 &global.App.Config
if err := v.Unmarshal(viperStruct); err != nil {
fmt.Println(err)
}
})
// 将配置赋值给全局变量 &global.App.Config
if err := v.Unmarshal(viperStruct); err != nil {
fmt.Println(err)
} return v
} // InitializeConfig 初始化配置函数
func InitializeConfig() {
// 全局应用文件配置路径,这边是我们的具体global config文件地址
config := "conf/files/config.yaml"
configAssemble(config, &global.App.Config) // 用户自定义的配置(根据不同的运行环境,加载不同的配置文件)
customConfig := fmt.Sprintf("%s%s%s", "conf/files/", global.App.Config.App.Env, "/custom.yaml")
configAssemble(customConfig, &global.App.Custom) }

2.6 整体文件结构如下

2.7 运行结果

main.go 代码如下:

package main

import (
"fmt"
"traffic.demo/global"
) // main 函数是程序的入口点
func main() { bootstrap.InitializeConfig()
fmt.Println("Traffic Service Started...!") var globalCong = global.App.Config
fmt.Printf("globalCong: %+v\n", globalCong)
var customCong = global.App.Custom
fmt.Printf("customCong: %+v\n", customCong)
}

效果如下:

3 总结

Viper 是一个功能强大、简洁、易于的 Go 配置库,帮助开发者轻松管理应用程序的配置,并提供灵活的接入方式

Viper:强大的Go配置解析库的更多相关文章

  1. OpenStack配置解析库oslo.config的使用方法

    OpenStack的oslo项目旨在独立出系统中可重用的基础功能,oslo.config就是其中一个被广泛使用的库,该项工作的主要目的就是解析OpenStack中命令行(CLI)或配置文件(.conf ...

  2. golang常用库:配置文件解析库-viper使用

    一.viper简介 viper 配置解析库,是由大神 Steve Francia 开发,他在google领导着 golang 的产品开发,他也是 gohugo.io 的创始人之一,命令行解析库 cob ...

  3. Papa Parse – 超强大的多线程 CSV 文本解析库

    Papa Parse 是一个与众不同的,在网页上运行的第一个多线程的 CSV 解析器.它可以解析千兆字节大小文件而不会导致浏览器崩溃.它能够正确地处理格式不正确或边缘的情况下的 CSV 文本.它可以分 ...

  4. python3解析库BeautifulSoup4

    Beautiful Soup是python的一个HTML或XML的解析库,我们可以用它来方便的从网页中提取数据,它拥有强大的API和多样的解析方式. Beautiful Soup的三个特点: Beau ...

  5. Tomjson - 一个"短小精悍"的 json 解析库

    Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把Java对象(JavaBean)序列化为json格式字符串,将json格式字符 ...

  6. 【转】编译quickfast解析库(沪深level2行情转码库)

     转自http://blog.csdn.net/hacode/article/details/7065889 编译quickfast解析库(沪深level2行情转码库) 目录(?)[-] 1 下载源代 ...

  7. iOS开源JSON解析库MJExtension

    iOS中JSON与NSObject互转有两种方式:1.iOS自带类NSJSONSerialization 2.第三方开源库SBJSON.JSONKit.MJExtension.项目中一直用MJExte ...

  8. Tomjson - json 解析库

    Tomjson - 一个"短小精悍"的 json 解析库 Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把 ...

  9. pyquery 的用法 --爬虫解析库

    如果你对Web有所涉及,如果你比较喜欢用CSS选择器,如果你对jQuery有所了解,那么这里有一个更适合你的解析库--pyquery. 接下来,我们就来感受一下pyquery的强大之处. 1. 准备工 ...

  10. Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例

    Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的 ...

随机推荐

  1. 02-HTML知识点

    01 元素的介绍 02 元素的属性 03 元素的嵌套关系 04 HTML结构分析 4.1 文档声明[这个不叫元素] 4.2 html元素 4.3 head元素 主要用来写文档的配置信息 05 HTML ...

  2. webdav协议及我的笔记方案(私有部署)

    背景 用markdown用于文章写作,有几年时间了,不是很喜欢折腾,主要就是在电脑上写,用的笔记软件就是typora.由于里面有很多工作相关的,以及个人资料相关的(包含了各种账号.密码啥的),所以不敢 ...

  3. hive案例:hive对房产数据进行过滤

    数据: 天通苑北一区 3室2厅 510万 1.01101E+11 天通苑北一区 3-2厅 143.09 平米 南北 简装 有电梯 35642 510旗胜家园 2室1厅 385万 1.01101E+11 ...

  4. UG 2406 python 二次开发环境配置

    UG 2406 python 二次开发环境配置 项目地址 https://gitee.com/unm001/nx2406.git 安装python 安装 python 3.10.11 D:\prog\ ...

  5. python subprocess读取终端输出内容

    参考链接:https://www.cnblogs.com/songzhenhua/p/9312718.html https://www.cnblogs.com/darkchii/p/9013673.h ...

  6. Codeforces Round 935 (Div. 3)

    A. Setting up Camp 题目描述 The organizing committee plans to take the participants of the Olympiad on a ...

  7. 树莓派4B-Python-控制超声波模块

    树莓派4B-Python-控制超声波模块 超声波模块: 超声波模块为常用的HC-SR04型号,有四个引脚,分别为Vcc.Trig(控制端).Echo(接收端).GND,使用起来也比较简单.在树莓派最新 ...

  8. 扬州万方:基于申威平台的 Curve 块存储在高性能和超融合场景下的实践

    背景 扬州万方科技股份有限公司主要从事通信.计算机和服务器.智能车辆.基础软件等产品的科研生产,是国家高新技术企业.专精特新小巨人企业.国家火炬计划承担单位. 业务介绍 申威处理器是在国家" ...

  9. oeasy教您玩转vim - 40 - # 复制粘贴

    ​ 复制粘贴 回忆上节课内容 我们上次的内容是粘贴 小写p意味着在光标下面或者后面粘贴 大写P意味着在光标上面或者前面粘贴 p的意思是放上去,就是put 把什么放上去呢? 把 reg 中 " ...

  10. [oeasy]python0012_字符_character_chr函数_根据序号得到字符

    ​ 字符(character) 回忆上次内容 上次了解了ord函数 这个函数可以通过字符得到序号 那么可以反过来吗? 通过序号得到字符可以吗? ​ 编辑 ord的逆运算chr 有来就有回 ​ 编辑 好 ...