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
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的简单实用的主要内容,如果未能解决你的问题,请参考以下文章