做了一个 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。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.