go基于viper实现配置文件热更新及其源码分析_ProblemTerminator的博客-CSDN博客_go热更新配置


本站和网页 https://blog.csdn.net/HYZX_9987/article/details/103924392 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

go基于viper实现配置文件热更新及其源码分析_ProblemTerminator的博客-CSDN博客_go热更新配置
go基于viper实现配置文件热更新及其源码分析
ProblemTerminator
已于 2022-06-24 16:54:27 修改
4474
收藏
分类专栏:
go实战大满贯
文章标签:
go
viper
于 2020-01-11 08:30:56 首次发布
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/HYZX_9987/article/details/103924392
版权
go实战大满贯
专栏收录该内容
2 篇文章
0 订阅
订阅专栏
go第三方库 github.com/spf13/viper  实现了对配置文件的读取并注入到结构中。
其中以
viperInstance := viper.New()// viper实例
viperInstance.WatchConfig()
viperInstance.OnConfigChange(func(e fsnotify.Event) {
log.Print("Config file updated.")
viperLoadConf(viperInstance) // 加载配置的方法
})
可实现配置的热更新,不用重启项目新配置即可生效(实现热加载的方法也不止这一种,比如以文件的上次修改时间来判断等)。
为什么这么写?这样写为什么就能立即生效?基于这两个问题一起来看看viper是怎样实现热更新的。
上面代码的核心一共两处:WatchConfig()方法、OnConfigChange()方法。WatchConfig()方法用来开启事件监听,确定用户操作文件后该文件是否可正常读取,并将内容注入到viper实例的config字段,先来看看WatchConfig()方法:
func (v *Viper) WatchConfig() {
go func() {
// 建立新的监视处理程序,开启一个协程开始等待事件
// 从I/O完成端口读取,将事件注入到Event对象中:Watcher.Events
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal(err)
defer watcher.Close()
// we have to watch the entire directory to pick up renames/atomic saves in a cross-platform way
filename, err := v.getConfigFile()
if err != nil {
log.Println("error:", err)
return
configFile := filepath.Clean(filename) //配置文件E:\etc\bizsvc\config.yml
configDir, _ := filepath.Split(configFile) // E:\etc\bizsvc\
done := make(chan bool)
go func() {
for {
select {
// 读取的event对象有两个属性,Name为E:\etc\bizsvc\config.yml,Op为write(对文件的操作)
case event := <-watcher.Events:
// 清除内部的..和他前面的元素,清除当前路径.,用来判断操作的文件是否是configFile
if filepath.Clean(event.Name) == configFile {
// 如果对该文件进行了创建操作或写操作
if event.Op&fsnotify.Write == fsnotify.Write || event.Op&fsnotify.Create == fsnotify.Create {
err := v.ReadInConfig()
if err != nil {
log.Println("error:", err)
v.onConfigChange(event)
case err := <-watcher.Errors:
// 有错误将打印
log.Println("error:", err)
}()
watcher.Add(configDir)
<-done
}()
其中,fsnotify是用来监控目录及文件的第三方库;  watcher, err := fsnotify.NewWatcher() 用来建立新的监视处理程序,它会开启一个协程开始等待读取事件,完成 从I / O完成端口读取任务,将事件注入到Event对象中,即Watcher.Events;
执行v.ReadInConfig()后配置文件的内容将重新读取到viper实例中,如下图:   
执行完v.ReadInConfig()后,config字段的内容已经是用户修改的最新内容了;
其中这行v.onConfigChange(event)的onConfigChange是核心结构体Viper的一个属性,类型是func:
type Viper struct {
// Delimiter that separates a list of keys
// used to access a nested value in one go
keyDelim string
// A set of paths to look for the config file in
configPaths []string
// The filesystem to read config from.
fs afero.Fs
// A set of remote providers to search for the configuration
remoteProviders []*defaultRemoteProvider
// Name of file to look for inside the path
configName string
configFile string
configType string
envPrefix string
automaticEnvApplied bool
envKeyReplacer *strings.Replacer
config map[string]interface{}
override map[string]interface{}
defaults map[string]interface{}
kvstore map[string]interface{}
pflags map[string]FlagValue
env map[string]string
aliases map[string]string
typeByDefValue bool
// Store read properties on the object so that we can write back in order with comments.
// This will only be used if the configuration read is a properties file.
properties *properties.Properties
onConfigChange func(fsnotify.Event)
它用来传入本次event来执行你写的函数。为什么修改会立即生效?相信第二个疑问已经得到解决了。
接下来看看OnConfigChange(func(e fsnotify.Event) {...... })的运行情况:
func (v *Viper) OnConfigChange(run func(in fsnotify.Event)) {
v.onConfigChange = run
方法参数为一个函数,类型为func(in fsnotify.Event)) {},这就意味着开发者需要把你自己的执行逻辑放到这个func里面,在监听到event时就会执行你写的函数,所以就可以这样写:
viperInstance.OnConfigChange(func(e fsnotify.Event) {
log.Print("Config file updated.")
viperLoadConf(viperInstance) // viperLoadConf函数就是将最新配置注入到自定义结构体对象的逻辑
})
而OnConfigChange方法的参数会赋值给形参run并传到viper实例的onConfigChange属性,以WatchConfig()方法中的v.onConfigChange(event)来执行这个函数。
到此,第一个疑问也就解决了。
关注博主即可阅读全文
ProblemTerminator
关注
关注
点赞
收藏
打赏
评论
go基于viper实现配置文件热更新及其源码分析
go第三方库 github.com/spf13/viper 实现了对配置文件的读取并注入到结构中,好用方便。其中以viperInstance := viper.New()// viper实例viperInstance.WatchConfig()viperInstance.OnConfigChange(func(e fsnotify.Event) {log.Print("C.........
复制链接
扫一扫
专栏目录
linux进程热更新 go,golang配置文件热更新
weixin_42166623的博客
05-01
111
配置文件热更新是服务器程序的一个基本功能,通过热更新可以不停机调整程序的配置,特别是在生产环境可以提供极大的便利,比如发现log打得太多了可以动态调高日志等级,业务逻辑参数变化,甚至某个功能模块的开关等都可以动态调整。每种语言都有自己的热更新实现方式,在golang里面我看到了有人采用了一种错误的实现方式,如下:type Config struct {Test1 string `json:"Tes...
Go Mac配置Air热加载
挂件
11-04
22
air 进行go项目的热重载
评论 1
您还未登录,请先
登录
后发表或查看评论
Go 学习笔记(82)— Go 第三方库之 viper(解析配置文件、热更新配置文件)
wohu1104的专栏
12-07
2018
1. viper 特点
viper 是一个完整的 Go应用程序的配置解决方案,它被设计为在应用程序中工作,并能处理所有类型的配置需求和格式。支持特性功能如下:
设置默认值
读取 JSON、TOML、YAML、HCL、envfile和 Java属性的配置文件
监控配置文件改动,并热加载配置文件
从环境变量中读取
从远程配置中心读取配置(etcd/consul),并监控变动
从命令行标志中读取
从缓冲区读取
支持直接设置配置项的值
viper读取配置文件的优先级顺序:
viper.Set() 所设置的值
内网工具viper的介绍与配置简介
最新发布
千寻的博客
11-09
1403
Viper(炫彩蛇)是提供图形化的操作界面,用户使用浏览器即可进行内网渗透.● db目录db.sqlite3 是Viper的SQL数据库文件dump.rdb 是Viper缓存数据库文件● log目录access.log nginx访问日志error.log nginx错误日志daphne.log viperpython websocket运行日志uwsgi.log viperpython http服务运行日志viperpython.log vipepython 主服务运行日志。
从nginx热更新聊一聊Golang中的热更新(下)
绯浅yousa的笔记
11-07
7139
从nginx热更新聊一聊Golang中的热更新(下)
静态语言在服务器编程时都会遇到这样的问题:如何保证已有的连接服务不中断同时又升级版本?
在上一篇介绍热升级的时候时候,讲到了通过信号通知nginx进行热升级。我们在这一篇中介绍下平滑重启go http server。
目录结构
热更新
热更新目标:
1、正在处理中的连接/服务/请求不能立即中断,需要继续提供服务
2、socket对用户来说...
go配置读取之viper库
weixin_50134791的博客
12-11
473
viper是用来读取的配置的库,viper可以从环境变量,yaml文件,json文件,命令行等读取配置,存到自己的key,value中
话不多说,看示例
go get github.com/spf13/viper
设置默认值
func InitConfig() {
v := viper.New()
v.SetDefault("ContentDir", "content")
fmt.Println(v.GetString("ContentDir"))
读取环境变量
func main() {
golang配置文件热更新
weixin_33907511的博客
02-26
678
原文地址-石匠的Blog: http://www.bugclosed.com/post/4
配置文件热更新是服务器程序的一个基本功能,通过热更新可以不停机调整程序的配置,特别是在生产环境可以提供极大的便利,比如发现log打得太多了可以动态调高日志等级,业务逻辑参数变化,甚至某个功能模块的开关等都可以动态调整。
每种语言都有自己的热更新实现...
golang实现热更新的常规方式
zyxpaomian的博客
02-02
5416
热更新
去年写了一个Agent的程序,用于收集生产服务器的一些数据,以及对应的一些自动化操作等, 写完之后经常要修修改改加一些新功能, 产线服务器数量就很多, 导致了每次更新都是个大动作,目前的做法是通过puppet管理,新版本就往puppet上丢,等他自动重启即可,由此联想到了老东家游戏服务的热加载,所以看了一下golang的热加载实现。
基本流程
第一种方式, 文件主体更新
golang服务进程运行时监听USR2信号
进程收到USR2信号后, 下载新版本的客户端到本地
fork子进程(启动新版本服
Go语言学习之viper读取yaml配置文件并转成struct
CharlesYan的博客
11-05
3530
总结golang解析yaml配置文件过程
goViper应用
一叶知秋
08-19
200
前言
感谢开源项目gin-vue-admin,以及1010工作室的教程,项目文档
我只是在跟着学习,然后记录下笔记而已,可能会有新的代码加入,但是本质还是跟着学习的一个过程。
这里记录的是开源项目的源码,感兴趣的可以直接撸源码去哈
Viper()
flag.StringVar
函数原型:
// StringVar defines a string flag with specified name, default value, and usage string.
// The argument p poi
Go常见包 — viper基础操作超级详解[2]
qq_39529682的博客
07-02
200
从中读取viper 支持从中读取配置。这种形式很灵活,来源可以是文件,也可以是程序中生成的字符串,甚至可以从网络连接中读取的字节流。
viper 支持将配置l到一个结构体中,为结构体中的对应字段赋值。
编译,运行程序,输出:
保存配置
有时候,我们想要将程序中生成的配置,或者所做的修改保存下来。viper 提供了接口!
编译、运行程序,生成的文件如下:
监听文件修改
viper 可以监听文件修改,热加载配置。因此不需要重启服务器,就能让配置生效。
只需要调用, 会自动监听配置修改。如果有修改,重新加载的
【GoCN酷Go推荐】使用 tableflip 实现应用的优雅热升级
Go中国
07-05
585
推荐 tableflip 的背景在日常研发过程中,我们负责的 web 应用常常会因发布过程中的服务重启而出现短时间的服务不可用或大量请求报错。随着互联网行业研发模式的逐渐敏捷和迭代周期的不...
golang 升级到新版本_从PHP迁移至Golang - 热更新篇
weixin_39536010的博客
12-22
142
上篇大致提到的Golang的热更新,本篇将详细论述。1、什么是热更新网络上有这么一个例子来形容热更新,我觉得很形象很贴切:一架行驶在高速上的大卡车,行驶过程中突然遭遇爆胎,热更新则是要求在不停车的情况下将车胎修补好,且补胎过程中卡车需要保持正常行驶。软件的热更新就是指在保持系统正常运行的情况下对系统进行更新升级。常见的情况有:系统服务升级、修复现有逻辑、服务配置更新等。2、热更新原理先来看下Ngi...
linux内核热更新,Golang热更新原理
weixin_28817625的博客
04-29
167
Linux进程间通信方式首先,进程之间为什么要进行通信呢?主要有以下应用场景:数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。资源共享:多个进程之间共享同样的资源。为了...
33-viper 配置文件加载
weixin_38753143的博客
07-25
260
viper是适用于Go应用程序的完整配置解决方案。设置默认值从JSON,TOML,YAML,HCL,envfile和javaproperties格式的配置文件中读取实时监控和重新读取配置文件从环境变量中读取从远程配置中心(etcd或consul)读取并监控配置变化从命令行参数读取配置从buffer读取配置显式配置值。...
go viper涉及多个配置文件时使用watchconfig 配置丢失问题
chsummer699的博客
01-23
2402
背景:
最近在项目使用中需要同时使用两个配置文件 一个是程序启动时需要的配置如日志级别 另一个是会更新的业务配置文件 使用同一个viper对象管理 发现只要这个文件变动触发viper更新则第一个文件的所有配置项丢失
原因:
即使读取第二个文件使用MergeInConfig 问题还会存在
查看源码发现
func (v *Viper) WatchConfig() {
initWG := sync.WaitGroup{}
initWG.Add(1)
go func() {
watche
linux进程热更新 go,golang热更新的技巧
weixin_36053926的博客
05-01
652
golang热更新的技巧发布时间:2020-03-27 13:40:45来源:亿速云阅读:778作者:小新今天小编给大家分享的是golang热更新的技巧,很多人都不太了解,今天小编为了让大家更加了解golang,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。golang可以热更新。下面我们就来看一下使用go+realize实现热更新:安装realize因为之前项目里面安装了 gin ...
Golang基于viper的配置热加载或动态变更方法介绍
Vancl_Wang Blog
11-25
3500
概述
  在写web server时,往往需要引入各种各样的配置信息,如依赖的其他中间件(redis、elasticsearch)等,一旦这些服务发生变更,我们需要重新启动web server,以使配置生效。在Golang中,基于viper的动态配置就可以省去这些繁琐的步骤了。接下来用一个示例来说明如何使用viper的配置热加载:
项目结构
  首先来看一下整个项目的目录结构:
- Dynamic...
Viper--方便好用的Golang 配置库
weixin_33726943的博客
08-15
455
前言
本文主要是为读者介绍一个轻便好用的Golang配置库viper
正文
viper 的功能
  viper 支持以下功能:
  1. 支持Yaml、Json、 TOML、HCL 等格式的配置
  2. 可以从文件、io、环境变量、command line中提取配置
  3. 支持自动转换的类型解析
  4. 可以远程从etcd中读取配置
示例代码
定义一个类型:
type config str...
golang常用库之配置文件解析库-viper使用详解
01-19
golang常用库:gorilla/mux-http路由库使用
golang常用库:配置文件解析库-viper使用
golang常用库:操作数据库的orm框架-gorm基本使用
golang常用库:字段参数验证库-validator使用
一、viper简介
viper 配置管理解析库,是由大神 Steve Francia 开发,他在google领导着 golang 的产品开发,他也是 gohugo.io 的创始人之一,命令行解析库 cobra 开发者。总之,他在golang领域是专家,很牛的一个人。
他的github地址:https://github.com/spf13
viper是一个配置管
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:成长之路
设计师:Amelia_0503
返回首页
ProblemTerminator
CSDN认证博客专家
CSDN认证企业博客
码龄4年
Go领域优质创作者
467
原创
1165
周排名
1028
总排名
128万+
访问
等级
1万+
积分
1万+
粉丝
509
获赞
221
评论
839
收藏
私信
关注
热门文章
Error creating bean with name的最佳解决方法
66742
解决AttributeError: ‘str‘ object has no attribute ‘get‘
50224
postman点击一次连续发送多个请求
31811
解决python报错TypeError: ‘tuple‘ object does not support item assignment
30097
go中string、int、float相互转换
26333
分类专栏
go并发之美
付费
21篇
容器相关分享-问题解决汇总
付费
21篇
Spring系列/微服务实战精华汇总
付费
18篇
go关键技术细节研究与分析精选
付费
14篇
研发问题解决、方法技巧、知识点总结合集
付费
18篇
go基础功能实现与问题解决集锦
付费
19篇
常用组件方法分享与问题解决汇总
付费
14篇
研发工具&环境
付费
17篇
prometheus监控与告警全纪录
付费
25篇
开发问题解决合集
30篇
java体系实战干货汇总
21篇
go模型封装、功能实现、精华汇总
mysql
1篇
java实战汇总
1篇
常用组件实践分享及问题汇总
常用分享、
6篇
spring相关
2篇
k8s/docker/rancher
38篇
java实战大满贯
26篇
读史以知兴衰
5篇
python
31篇
go常见问题解决汇总
88篇
各种语言问题大合集
spring生态
2篇
ES/搜索引擎
1篇
春去秋来
3篇
db&orm
26篇
go语言破冰之旅
7篇
nodejs
2篇
php
3篇
对事物的思考
4篇
design pattern
4篇
传输/存储
2篇
算法&数据结构
11篇
linux/vm
18篇
大数据
1篇
网络/协议
10篇
研发总结
9篇
go实战大满贯
2篇
xml/jsp/servlet
1篇
js/ajax/thymeleaf
1篇
最新评论
Error creating bean with name的最佳解决方法
s1213_24548:
也有可能数循环注入
golang获取目录下所有文件
恋喵大鲤鱼:
感谢分享,不过获取目录下所有文件,有很多特殊情况需要考虑。
1.是否需要递归?
2.遇到符号链接怎么办。
具体实现可参考:https://blog.csdn.net/K346K346/article/details/128024386。
合并两个有序单链表为一个有序链表
programmer_ada:
哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)文章不宜太短;(2)增加除了各种控件外,文章正文的字数;(3)使用标准目录。
解决python报错ModuleNotFoundError: No module named ‘xxx‘
???Rocky?:
这个错误尝试了,pip install machine -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
重启树莓派后依然没有用
解决python报错ModuleNotFoundError: No module named ‘xxx‘
???Rocky?:
Python ModuleNotFoundError: No module named 'machine'
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
俯瞰·明统一战争·鼓行而西、平西北之战
俯瞰·明统一战争·攻山西之战
生活中我们如何避免忘事?
2022
12月
1篇
11月
3篇
10月
12篇
09月
16篇
08月
8篇
07月
16篇
06月
45篇
05月
16篇
04月
6篇
03月
14篇
02月
6篇
01月
13篇
2021年84篇
2020年95篇
2019年150篇
目录
目录
分类专栏
go并发之美
付费
21篇
容器相关分享-问题解决汇总
付费
21篇
Spring系列/微服务实战精华汇总
付费
18篇
go关键技术细节研究与分析精选
付费
14篇
研发问题解决、方法技巧、知识点总结合集
付费
18篇
go基础功能实现与问题解决集锦
付费
19篇
常用组件方法分享与问题解决汇总
付费
14篇
研发工具&环境
付费
17篇
prometheus监控与告警全纪录
付费
25篇
开发问题解决合集
30篇
java体系实战干货汇总
21篇
go模型封装、功能实现、精华汇总
mysql
1篇
java实战汇总
1篇
常用组件实践分享及问题汇总
常用分享、
6篇
spring相关
2篇
k8s/docker/rancher
38篇
java实战大满贯
26篇
读史以知兴衰
5篇
python
31篇
go常见问题解决汇总
88篇
各种语言问题大合集
spring生态
2篇
ES/搜索引擎
1篇
春去秋来
3篇
db&orm
26篇
go语言破冰之旅
7篇
nodejs
2篇
php
3篇
对事物的思考
4篇
design pattern
4篇
传输/存储
2篇
算法&数据结构
11篇
linux/vm
18篇
大数据
1篇
网络/协议
10篇
研发总结
9篇
go实战大满贯
2篇
xml/jsp/servlet
1篇
js/ajax/thymeleaf
1篇
目录
评论 1
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
ProblemTerminator
您的鼓励将是作者最大的动力哦!
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值