我原来一直很欣赏ssh的配置管理方式: 每一个配置项都有一个默认值 这些默认值可以配置文件(/etc/ssh/ssh_config)中修改 每个配置项都可以通过命令行参数临时覆盖 一直以来笔者都希望在自己的项目中实现类似的功能...在研究Golang周边生态时,我发现了viper(https://github.com/spf14/viper)这个全面的配置解决方案,它提供的比我能想到的还要多: 支持多种配置文件格式,包括 JSON...,TOML,YAML,HECL,envfile,甚至还包括Java properties 支持为配置项设置默认值 可以通过命令行参数覆盖指定的配置项 支持参数别名 viper按照这个优先级(从高到低)获取配置项的取值...: explicit call to Set: 在代码逻辑中通过viper.Set()直接设置配置项的值 flag:命令行参数 env:环境变量 config:配置文件 key/value store:...,如viper.BindPFlag("global.source", pflag.Lookup("global.source")) 默认值 viper支持为配置项设置默认值,如果在配置文件,环境变量,以及命令行参数中都没有设置
(etcd 或 Consul)中的配置信息,并监控配置信息发生改变 读取命令行参数中的配置信息 读取 buffer 中的配置信息 显式设置配置项 可以将 Viper 视为满足您所有应用程序配置需求的注册表...用户提供了与默认值相同的命令行或配置文件时,可以容易地于区分它们的区别。 Viper 使用以下优先顺序。...每个项目优先于其下面的项目: 显式调用 Set 方法设置值 flag(命令行参数) env(环境变量) config(配置文件) key/value 存储 默认值 重要:Viper 配置项的 Key 不区分大小写...03 怎么将配置项写入 Viper? 安装 go get github.com/spf13/viper 建立默认值 一个好的配置系统应该支持默认值。...在上面的所有示例中,他们都以单例模式风格演示了使用 Viper 的使用方法。 使用多个 Viper 实例 您还可以创建许多不同的 Viper 实例,供应用程序使用。每个都有其独特的配置和值集。
它还支持环境变量、命令行标志、远程配置系统(如etcd或Consul),并且可以直接监控配置文件的变化。 如何使用Viper?...= nil { // 处理读取配置文件的错误 panic(fmt.Errorf("Fatal error config file: %s \n", err)) } 获取配置值 一旦Viper读取了配置文件...,我们就可以使用Get函数来获取配置值: port := viper.GetInt("port") databaseDriver := viper.GetString("database.driver"...) 设置默认值 Viper也允许我们设置配置的默认值。...这在配置项未在配置文件中定义,但我们又需要一个默认值的情况下非常有用: viper.SetDefault("ContentDir", "content") viper.SetDefault("LayoutDir
组件分享之后端组件——Golang的配置文件管理组件viper 背景 近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组件...组件基本信息 组件:viper 开源协议:MIT License 内容 本节我们分享一个在Golang中比较常用的组件配置文件管理组件viper,在目前社区里面还是非常火的,其使用方式也比较简单,具体如下...: 使用方式如下: 1、进行安装 go get github.com/spf13/viper 2、读取配置文件 viper.SetConfigName("config") // 配置文件的名称(没有扩展名...) viper.SetConfigType("yaml") // 如果配置文件名称中没有扩展名,则是必需的 viper.AddConfigPath("/etc/appname/") // 在其中查找配置文件的路径...= nil { // 处理读取配置文件错误 panic(fmt.Errorf("Fatal error config file: %w \n", err)) } 更多使用方式和框架中的封装方式,
比较有名的方案有 使用viper管理配置[1] 支持多种配置文件格式,包括 JSON,TOML,YAML,HECL,envfile,甚至还包括Java properties 支持为配置项设置默认值 可以通过命令行参数覆盖指定的配置项...支持参数别名 viper[2]按照这个优先级(从高到低)获取配置项的取值: explicit call to Set: 在代码逻辑中通过viper.Set()直接设置配置项的值 flag:命令行参数...env:环境变量 config:配置文件 key/value store:etcd或者consul default:默认值 按照这个优先级(从高到低)获取配置项的取值: explicit call to...Set: 在代码逻辑中通过viper.Set()直接设置配置项的值 flag:命令行参数 env:环境变量 config:配置文件 key/value store:etcd或者consul default...", "database.json") 根据环境变量加载配置文件 or 从shell加载配置项 详细可参考 Golang Configor 配置文件工具[7] 热更新 package main import
导读 最近要封装一个公共服务,涉及到配置项的地方总是找不到合理的方案,后来看了一下grpc在配置方面的封装,了解到原来是golang特有的Functional Options编程模式,今天分享给大家,希望你能用到...和main函数虽然在同一个文件里面,其实Server是作为外部包使用的,下面的case都同理 既然上面无法满足咱们的需求,那么咱们就来修改一下 版本V2 既然配置项想要可选,那么咱们直接来个排列组合,调用不同的初始化方法即可只初始化自己想初始化的非必要选项...,但是如果有十几个可选参数,那么需要构造的初始化方法是非常多的 一般情况下,对一个工具初始化都是统一的方法,这样处理的话初始化方法太多了,这一块的内容对使用者来说是不关心的,所以很不友好 不想传的参数的默认值依然没有解决...它是为了解决代码扩展性的问题,往往是通过增加抽象牺牲了简单性,切勿过度使用。有些简单的配置,就不需要设计的这么通用了。...函数式选项模式的使用场景有哪些呢: 我们一般用来配置一些基础的服务配置,比如MySQL,Redis,Kafka的配置,很多可选参数,可以方便动态灵活的配置想要配置的参数。
Golang中的Viper库:强大的配置管理解决方案在Golang(Go)的开发中,配置管理是一个不可或缺的部分。...设置配置文件路径使用SetConfigFile方法设置配置文件的路径,可以通过SetConfigName和SetConfigType方法分别设置配置文件的名称和类型。...(fmt.Errorf("Fatal error config file: %s \n", err)) }}获取配置值一旦配置文件被读取,就可以使用Get系列函数来获取配置值。...还支持为配置项设置默认值,这在配置项未在配置文件中定义,但我们又需要一个默认值的情况下非常有用。...= nil { panic(fmt.Errorf("配置文件修改以后,报错啦,err:%v", err)) }})三、Viper使用示例以下是一个完整的示例,展示了如何使用Viper
这里我们需要用到一个Go语言写的开源库使用Viper,选用Viper主要原因是支持它支持从项目文件、远端ETCD和Consul中读取配置,兼容性更高一些。...配置文件的格式,其实用JSON还是YAML都可以,只不过YAML的风格在配置项较多的时候会显得更清晰一些,这个其实没用特别要求必须用哪个,大家搭建项目时尽量选择支持读取多种文件格式配置的开源库,比如这里会用到的...配置加载到程序后尽量不要去进行更改,因为这些配置大部分都是全局的一旦更改很有可能会影响项目其他部分的程序。这个从程序的语法层面上限制比较困难,所以需要我们在团队内部先达成配置只能是只读的这种共识。...另外两个boostrap.go 和 config.go 是下面使用Viper读取加载配置时用到的。...使用 Viper 加载和读取配置 项目安装 Viper 依赖 go get github.com/spf13/viper@v1.12.0 为了兼容性,选择一个稍旧的版本,viper@v1.12.0 后面的版本会不支持
01 介绍 Validator 是基于 tag(标记)实现结构体和单个字段的值验证库,它包含以下功能: 使用验证 tag(标记)或自定义验证器进行跨字段和跨结构体验证。...关于 slice、数组和 map,允许验证多维字段的任何或所有级别。 能够深入 map 键和值进行验证。 通过在验证之前确定接口的基础类型来处理类型接口。...别名验证标记,它允许将多个验证映射到单个标记,以便更轻松地定义结构体上的验证。 提取自定义的字段名称,例如,可以指定在验证时提取 JSON 名称,并在生成的 FieldError 中使用该名称。...,错误输出信息并不友好,错误输出信息中的字段不仅没有使用备用名(首字母小写的字段名),也没有翻译为中文。...必需的 unique 唯一的 isDefault 默认值 len 长度 email 邮箱格式 05 总结 本文简单介绍了在 Go 语言中比较流行的值验证库 Validator,通过简单示例介绍了 validator
在实际开发中,我们往往会给一个逻辑设计一套配置文件,用于根据不同环境加载不同配置。 比如生产环境和测试环境数据库的地址不一样,我们就需要在配置文件中设置不同的值。...但是配置文件中又有一些相同值的配置项,比如数据库的名称等。难道相同的配置要像下面这样写多次吗?...:我们设置一个默认项(default)用于填充相同的值,然后在不同环境中填充不同的值。...conn_max_lifetime_seconds: 3 user: username: un password: pwd 这样我们在取pro、pre、dev和test环境的配置时...,会让它们和default取合集,从而变成一个完整的配置。
我们把config目录删掉,然后测试: 这证明了上面的结论:外部config目录 > 外部同级目录 > jar包内部config目录 > jar包内部同级目录 是成立了 配置项默认值 通过上面的分析,我们知道了...假如该配置文件没有设置server.port默认值的时候,那么就会往下一级配置文件去寻值,如果所有配置文件都找不到,那么将会读取默认的值。...server.port这个默认值,是springboot内部给我们提供的,其默认就是8080。 那么我们要怎么给我们自定义的配置项设置默认值呢?...其实很简单,只需要使用一个":"即可 启动程序,访问该接口: 我们没有在任何一处配置文件中配置name的值,所以读取了默认值。...总结 本文讲解了SpringBoot项目的多种放配置文件的方式,并且讲解了各种配置文件的加载顺序。在配置文件中都不存在值的时候,最后才会去读取默认值。
我们把config目录删掉,然后测试: image.png 这证明了上面的结论:外部config目录 > 外部同级目录 > jar包内部config目录 > jar包内部同级目录 是成立了 配置项默认值...假如该配置文件没有设置server.port默认值的时候,那么就会往下一级配置文件去寻值,如果所有配置文件都找不到,那么将会读取默认的值。...server.port这个默认值,是springboot内部给我们提供的,其默认就是8080。 那么我们要怎么给我们自定义的配置项设置默认值呢?...其实很简单,只需要使用一个":"即可 image.png 启动程序,访问该接口: image.png 我们没有在任何一处配置文件中配置name的值,所以读取了默认值。...总结 本文讲解了SpringBoot项目的多种放配置文件的方式,并且讲解了各种配置文件的加载顺序。在配置文件中都不存在值的时候,最后才会去读取默认值。
2.语法 INI 是一种简单实用且应用广泛的配置文件格式,通常由节、键值对和注释组成。 节 节(Section)是键值对的分组。 一般情况下,节是可选的,不属于任何节的配置项属于全局配置项。...[section] domain = example.com [section.subsection] foo = bar 键值对 每一个键值对表示一项配置,键与值使用等号分隔。...字符串值通常不需要引号,但在某些情况下可以使用引号(单引号或双引号)括起来。...INI 的解析,比如 Golang 中强大的 spf13/viper。...= nil { fmt.Printf("Error reading config file, %s", err) return } // 获取配置项的值 fmt.Println("server.name
因此,如果您想将Map用于一个类似内存数据库,那么使用我们的版本可能会受益。...它与这些早期包的不同之处在于uuid是一个16字节数组,而不是一个字节片。此更改导致的一个损失是表示无效UUID(与NIL UUID相比)的能力。...Viper配置解析图片Viper需要最少的配置,因此它知道在哪里查找配置文件。Viper支持JSON、TOML、YAML、HCL、INI、envfile和Java财产文件。...Viper可以搜索多个路径,但目前单个Viper实例仅支持单个配置文件。Viper不默认任何配置搜索路径,将默认决策留给应用程序。...Import导入:go get github.com/spf13/viperGithub地址: https://github.com/spf13/viper说明:配置文件解析库,功能及其强大示例viper.SetConfigName
Viper 功能还是很强大的,还支持优先级管理、自动重载配置、嵌套配置等等,而且简单易用。如果你使用 Go 语言开发项目需要配置管理,Viper 是不二的选择。...可以为配置项设置默认值,如果配置文件中没有指定该项,则使用默认值。...使用语法: viper.SetDefault("app.port", 8080) 自动重载 支持监视配置文件的变化,并在文件更改时自动重新加载配置。...) }) 绑定环境变量 允许将环境变量与配置项绑定,使得环境变量可以覆盖配置文件中的值。...使用语法: viper.SetConfigName("config") viper.AddConfigPath(".") viper.MergeInConfig() 动态赋值 可以通过编程方式动态设置和更新配置项
配置项概述 什么是配置项 配置用来规定一些程序在启动时读入设定,提供了一种修改程序设置的手段, 针对不同的对象可以使用不同的配置。 配置项是多个配置的集合,配置项的值可以是字符串,也可以是文件。...配置项支持YAML格式和可视化编辑, 单击查看 YAML 语法。 配置项只支持新增版本,不支持修改版本。...配置项有什么价值 使用配置项功能可以帮您管理不同环境、不同业务的配置,支持多版本,支持Yaml格式 方便您部署相同应用的不同环境,配置文件支持多版本,方便您进行更新和回滚应用 方便您快速将您的配置以文件的形式导入到容器中...配置文件的使用 使用方法一: 将配置项中的配置以数据卷的形式挂载到容器中 使用方法二: 创建服务时引用配置项环境变量 配置项以数据卷形式挂载到容器中 1.新建配置文件 图片.png 图片.png...变量值说明: 我们替换的是/etc/nginx/conf.d/localhost.conf文件内容 将原配置文件中的日志文件:error_log /data/logs/nginx/wordpress.tencent.com_error.log
因此,如果您想将Map用于一个类似内存数据库,那么使用我们的版本可能会受益。...当你构建时,你需要知道你有多少元素(期望的容量),以及你愿意容忍的期望假阳性率是多少。常见的假阳性率为1%。假阳性率越低,需要的内存就越多。同样,容量越高,使用的内存就越多。...它与这些早期包的不同之处在于uuid是一个16字节数组,而不是一个字节片。此更改导致的一个损失是表示无效UUID(与NIL UUID相比)的能力。...Viper配置解析Viper需要最少的配置,因此它知道在哪里查找配置文件。Viper支持JSON、TOML、YAML、HCL、INI、envfile和Java财产文件。...Viper可以搜索多个路径,但目前单个Viper实例仅支持单个配置文件。Viper不默认任何配置搜索路径,将默认决策留给应用程序。
知识分享之Golang——和我一起搭建一个快速开发框架(一) 背景 知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。...开发环境 系统:windows10 语言:Golang golang版本:1.17 代码仓库:FastDevelopGo 内容 日常我们使用golang开发项目时经常需要使用一些基础组件,每次新建较为繁琐...,现有市面上的感觉不太适合自己,因此决定自己搭建一套,同时开源出来分享给大家使用,欢迎大家提出各种需求。...2、开始整合自定义配置文件读取组件 2.1、分析对比 日常我们读取配置文件时常用的格式有: json 格式字符串 xml 文件 yml 格式文件 toml 格式文件 ini 格式文件 常用的golang...配置文件读取库目前市面上也有很多,其中我认为Viper更适合于这个框架的使用,因此本次框架中使用该组件库作为配置文件的管理组件。
多层次的配置来源:Viper 可以从配置文件、环境变量、命令行参数、远程配置中心、默认值等多个来源读取配置。支持动态配置:可以监控和热更新远程配置中心的配置。...Viper 读取配置的优先级显式调用 Set 方法设置的值命令行参数(flag)环境变量配置文件key/value 存储(如 etcd、consul)默认值从 YAML 文件读取配置我们首先来看如何从本地的...读取配置文件:viper.ReadInConfig() 用于读取配置文件,读取失败时应进行错误处理。检查配置是否存在:viper.IsSet("mysql.host") 可以检查某个配置项是否存在。...设定默认值:viper.SetDefault("port", 8081) 用于设置配置项的默认值。覆盖配置值:viper.Set("port", 8082) 可以在运行时动态更改配置值。...需要特别注意的是:这个配置基本上是配合远程配置中心使用的,比如 etcd、consul、zookeeper 等,告诉 viper 当前的数据使用什么格式去解析。
领取专属 10元无门槛券
手把手带您无忧上云