Viper的简单实用

Posted 99kol

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Viper的简单实用相关的知识,希望对你有一定的参考价值。

安装:

  go get github.com/spf13/viper

介绍:

  Viper 是一个完整的 Go 应用程序配置解决方案。

  • 支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多种格式的配置文件
  • 可以设置监听配置文件的修改,修改时自动加载新的配置
  • 从环境变量、命令行选项和io.Reader,远程K/V中读取配置
  • 从远程配置系统中读取和监听修改,如 etcd/Consul
  • 代码逻辑中显示设置键值

简单示例:【读取配置文件字段内容】

package main

import (
	"fmt"
	"github.com/spf13/viper"
)

func main() 
	v := viper.New()
	v.SetConfigFile("./user-web/viper_test/config.yaml")
	if err := v.ReadInConfig(); err != nil 
		panic(err)
	
	fmt.Println(v.Get("name"))
	fmt.Println(v.Get("desc"))

配置文件描述:

控制台输出信息:

Go语言-配置管理神器viper

工程目录

在这里插入图片描述

使用viper读取配置的简单demo

实现根据配置文件key获取value。
根据key前缀将value批量解析到结构体。
实时更新配置

配置文件config.properties

version=1.0
port=8080
demo.name=测试2
demo.user=tom
demo.age=10

main.go

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/spf13/viper"
	"net/http"
)

func main() {
	//初始化配置解析
	initViper()
	//生成gin引擎
	r := gin.Default()
	//初始化路由配置
	initRoutes(r)
	if err := r.Run(
		fmt.Sprintf(":%d", viper.GetInt("port"))); err != nil {
		panic(err)
	}
}

//全局变量-配置结构体
var Conf Config

//控制器方法version
func version(c *gin.Context) {
	fmt.Println("从viper直接读取的配置,demo.name:", viper.GetString("demo.name"))
	// 将读取的配置信息保存至全局变量Conf,若配置信息在子树中可以用viper.sub提取出来再解析到对应的结构体。相当于前缀解析
	if err := viper.Sub("demo").Unmarshal(&Conf); err != nil {
		panic(fmt.Errorf("unmarshal conf failed, err:%s \\n", err))
	}
	fmt.Println("结构体中的配置,Conf:", Conf)
	//响应
	c.String(http.StatusOK, viper.GetString("version"))
}

// Config 结构体
type Config struct {
	Name string `json:"name"`
	User string `json:"user"`
	Age  int    `json:"age"`
}

//初始化路由配置
func initRoutes(r *gin.Engine) {
	// 访问/version的返回值会随配置文件的变化而变化
	r.GET("/version", version)
}

//初始化viper配置解析
func initViper() {
	viper.SetConfigFile("conf.properties") // 指定配置文件
	viper.SetConfigName("config")     // 配置文件名称(无扩展名),没有这个会报找不到文件
	viper.SetConfigType("properties") // 如果配置文件的名称中没有扩展名,则需要配置此项
	viper.AddConfigPath("./conf")     // 指定查找配置文件的路径
	//viper.AddConfigPath(".")               //可以配置多个目录,还可以在工作目录中查找配置
	err := viper.ReadInConfig() // 读取配置信息
	if err != nil {             // 读取配置信息失败
		panic(fmt.Errorf("Fatal error conf file: %s \\n", err))
	}
	// 监控配置文件变化,实时更新到内存中
	viper.WatchConfig()
}

测试日志

[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:	export GIN_MODE=release
 - using code:	gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /version                  --> main.version (3 handlers)
[GIN-debug] Listening and serving HTTP on :8080
从viper直接读取的配置,demo.name: 测试2
结构体中的配置,Conf: {测试2 tom 10}
[GIN] 2021/05/23 - 16:27:19 | 200 |       797.8µs |             ::1 | GET      "/version"

使用外部配置文件

将conf文件夹拷出,放到exe同级目录,则直接使用外部配置文件,更新配置非常方便。
在这里插入图片描述
入门完毕,其他使用方法网上有很多,不再赘述。

以上是关于Viper的简单实用的主要内容,如果未能解决你的问题,请参考以下文章

内网viper的简单使用

内网viper的简单使用

iOS VIPER架构

golang viper & hcl 配置文件问题

VIPER 架构

使用viper 进行golang 应用的配置管理