探索Viper-适用于GoLang的完整配置解决方案

2024-01-29 13:20

本文主要是介绍探索Viper-适用于GoLang的完整配置解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

        对于现代应用程序,尤其大中型的项目来说,在程序启动和运行时,往往需要传入许多参数来控制程序的行为,我们可以通过命令行参数,环境变量,配置文件等方式来将参数传递给程序。而Viper库为Golang语言开发者提供了对不同数据源和不同格式的配置文件的读取,是Go项目读取配置的神器,我们今天就来讲讲如何使用Viper来解析配置信息。

目录

前言

Viper简介

快速上手

库的安装

读取配置文件

更多语法

写回配置文件

监听配置文件

注册和使用别名

读取环境变量

封装使用

1.安装库

2.编写配置文件,yaml为例

3.定义配置映射的结构体

4.编写配置读取初始化函数

5.主程序启动前调用初始化函数

总结


Viper简介

        Viper是适用于Go应用程序(包括Twelve-Factor App)的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持以下特性:

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

快速上手

库的安装

viper的安装非常简单,如同其他Go第三方包一样,只需要go get命令即可安装

go get github.com/spf13/viper

导入

import "github.com/spf13/viper"

读取配置文件单个属性

viper.SetConfigFile("./config.yaml")
viper.ReadInConfig()
fmt.Println(viper.Get("我是不区分大小写的key"))

序列化为对象

// 首先声明一个配置映射对象
type DB struct {host stringport string
}func main() {viper.SetConfigName("config")viper.SetConfigType("yaml")viper.AddConfigPath(".")viper.ReadInConfig() // 读取配置var mysql DBviper.Unmarshal(&mysql) 将读取到的配置序列化为对象fmt.Println(mysql.host)fmt.Println(mysql.port)
}

以上就是viper的简单使用,可以看出使用起来还是很方便简洁的。

更多语法

写回配置文件

此外,viper还支持将配置值写入配置文件,viper提供了四个函数将配置写回文件。

WriteConfig

WriteConfig函数会将配置写入预先设置好路径的配置文件中,如果配置文件存在,则覆盖,如果没有,则创建。

SafeWriteConfig

SafeWriterConfig与WriteConfig函数唯一的不同是如果配置文件存在,则会返回一个错误。

WriteConfigAs

WriteConfigAs与WriteConfig函数的不同是需要传入配置文件保存路径,viper会根据文件后缀判断写入格式。

SafeWriteConfigAs

SafeWriteConfigAs与WriteConfigAs的唯一不同是如果配置文件存在,则返回一个错误。

监听配置文件

viper支持监听配置文件,并会在配置文件发生变化,重新读取配置文件和回调函数,这样可以避免每次配置变化时,都需要重启启动应用的麻烦。

// 设置监听回调
viper.OnConfigChange(func(e fsnotify.Event) {fmt.Println("检测到配置文件已更改:", e.Name)
})// 开启监听
viper.WatchConfig()

注册和使用别名

为某个配置key设置别名,这样可以方便我们在不改变key的情况下,使用别的名称访问该配置。

viper.Set("name", "张三")//为name设置一个username的别名
viper.RegisterAlias("username", "name")//通过username可以读取到name的值
fmt.Println(viper.Get("username"))//修改name的配置值,username的值也发生改变
viper.Set("name", "李四")// 输出结果为李四
fmt.Println(viper.Get("username"))

读取环境变量

对于读取操作系统环境变量,viper提供了下面五个函数:

  • AutomaticEnv()
  • BindEnv(string...) : error
  • SetEnvPrefix(string)
  • SetEnvKeyReplacer(string...) *strings.Replacer
  • AllowEmptyEnv(bool)

viper读取环境变量,主要有两种方式:

1.开启AutomaticEnv函数,可直接读取环境变量

// 读取不到
fmt.Println(viper.Get("path"))//开始读取环境变量
viper.AutomaticEnv()//会从环境变量读取到该值
fmt.Println(viper.Get("path"))

2.使用BindEnv绑定某个环境变量

//将p绑定到环境变量PATH,注意这里第二个参数是环境变量
viper.BindEnv("p", "PATH")// 通过p读取PATH的值
fmt.Println(viper.Get("p"))

封装使用

1.安装库

go get github.com/spf13/viper

2.编写配置文件,yaml为例

新建config.yaml配置文件,内容如下

app: # 应用基本配置env: local # 环境名称port: 8080 # 服务监听端口号app_name: online-practice-system # 应用名称app_url: http://localhost # 应用域名

3.定义配置映射的结构体

这里因为配置有多层,所以我们结构体也要对应多层,我们可以再标签中通过设置mapstructure属性来设置配置的属性名

// Configuration为管理全部配置的父结点
type Configuration struct {App      App      `mapstructure:"app" yaml:"app"`
}
// 如果是多层配置,就需要定义多层结构体
type App struct {// 在tag标签中加入yaml:"env"`,声明配置对应关系Env     string `mapstructure:"env" yaml:"env"`Port    string `mapstructure:"port" yaml:"port"`AppName string `mapstructure:"app_name" yaml:"app_name"`AppUrl  string `mapstructure:"app_url" yaml:"app_url"`
}

4.编写配置读取初始化函数

这里我们定义了初始化函数,将配置读取到自己global包下的App.Config全局变量,这里可以自己选择读取那哪

package bootstrap
import ("fmt""github.com/fsnotify/fsnotify""github.com/spf13/viper""online-practice-system/global""os"
)
// viper读取配置文件初始化
func InitializeConfig() *viper.Viper {// 设置配置文件路径config := "config.yaml"// 生产环境可以通过设置环境变量来改变配置文件路径if configEnv := os.Getenv("VIPER_CONFIG"); configEnv != "" {config = configEnv}// 初始化 viperv := viper.New()v.SetConfigFile(config)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 fileDriver changed:", in.Name)// 重载配置,这里可以进行重启服务器,或者其他操作if err := v.Unmarshal(&global.App.Config); err != nil {fmt.Println(err)}})// 将配置赋值给全局变量if err := v.Unmarshal(&global.App.Config); err != nil {fmt.Println(err)}return v
}

5.主程序启动前调用初始化函数

func main() {//  初始化yaml配置文件InitializeConfig()///
}

总结

        Viper是一个功能强大且易于使用的配置读取库,它可以帮助我们简化配置的读取和管理过程,提高应用程序的灵活性和可维护性。无论是小型项目还是大型应用程序,Viper都是一个值得推荐的配置读取解决方案。

        最后,感谢阅读,如果文章对您有帮助的话,请多多三连吧~

这篇关于探索Viper-适用于GoLang的完整配置解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/657039

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

mybatis映射器配置小结

《mybatis映射器配置小结》本文详解MyBatis映射器配置,重点讲解字段映射的三种解决方案(别名、自动驼峰映射、resultMap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录select中字段的映射问题使用SQL语句中的别名功能使用mapUnderscoreToCame

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版