做了一个 golang 应用实时更新配置的第三方包欢迎大家点评和 star https://github.com/ppmoon/golang-redis-config
GRC 是一款使用 golang redis 对应用程序的配置文件进行热更新的一款软件,方便在应用程序启动的过程当中实时更新我们的配置文件。
可以参考测试文件
//使用 NewGrc 实例化 第一个参数是.env 文件 第二个参数是 redis 地址,第三个参数是 redis 密码,第四个参数是 redis 分区号。0 就是默认的数据库
//.env 是使用 kv 来设置参数哒
g := grc.NewGrc(".env","localhost:6379","",0)
//监听.env 变化。注意:这里需要单独启动一个 go 程监听文件变化,否则会影响你的主要 go 程。
go g.WatchFile()
//GetItem 获得配置文件。
config := g.GetItem("ack")
fmt.Println(config)
golang 这种编译型语言无法像 PHP 一样实时的热更新配置数据。为了让 golang 更加简单的热更新配置文件所以设计制作了 GRC 这个热更新配置文件的包。
具体思路是使用 redis 内存数据库作为配置的存放容器,然后让 golang 直接读取 redis 的数据作为配置数据,更新配置的时候,我们只要去更新 redis 里面的数据,golang 应用程序就可以实时更新了。但是平凡的去操作数据库是危险的,所以本程序额外使用了一个.env 的配置文件和 php laravel 的配置文件类似,GRC 会新启动一个 go 程去监听.env 的变化,GRC 初始化的时候会先将.env 的数据以 KV 的形式存入 redis,如果.env 发生变化,GRC 会更新 redis 当中的配置列表。这样做的好处是,我们可以在外部使用编辑器更新配置文件,同时又不同 golang 程序去读取.env 文件,相比读取磁盘上的配置文件,读取 redis 内存当中的数据速度要快很多,否则频繁的打开和关闭.env 会造成磁盘性能的损耗。
1.我们可以在项目目录当中配置一个 config.go 的文件,每次修改的时候修改这个文件的内容,然后重新编译项目。 2.我们可以写一个外部的 yaml 文件,每次都让 golang 应用去读取 yaml 读取配置。这样也可以热更新,但是问题就像上面说的,会频繁的触发磁盘 IO 操作。 3.我们可以让 golang 应用监听一个配置 channel,然后我们用 golang 编写另外一个 cli 程序如果需要修改配置的时候就向这个管道写入数据,然后 golang 应用就去更新配置变量。
以上是我可以想到的方法都有利有弊,相对来说我觉得使用 redis 更省事,所以 GRC 的方案也不错。以上欢迎指教和 star。
1
gamexg 2018-07-14 12:13:11 +08:00 via Android 1
配置更新是原子的吗?
频繁读取文件一般不会造成频繁的读取操作,操作系统会有缓存。 go 协程无法跨进程通信。 |
2
heww 2018-07-14 13:27:19 +08:00 via iPhone
go-micro 的 go-config 了解一下。
|
4
Immortal 2018-07-14 15:37:33 +08:00
以前做法是启了一个协程监听配置文件改动 改动了做 reload 操作的处理
|