简介
在上次的实践中, 启动了一个基础的 restful api server.
当时的代码中有很多硬编码的属性, 这次就要尝试从配置文件中读取.
使用 viper 读取配置
这里使用 viper 读取配置, 首先安装一下.
创建一个 config 目录, 然后添加 config.go 文件, 在里面定义一个结构 Config, 使用 Name 保存配置路径.
然后定义它的两个方法, 一个读取配置, 另一个观察配置的改动.
读取配置时定义了多种方式, 第一个种是没有定义 Config.Name, c.Name 为空字符串的情况, 这时会从默认路径中寻找配置文件.
另外一种就是直接指定了配置文件的路径, 那是就直接使用这个配置文件.
大写__.webWEB_LOG_PATHlog.pathviper.GetString("log.path")使用 Cobra 创建命令行工具
使用 viper 读取配置之后, 为了更灵活的使用, 势必要使用 CLI 工具, 以便在运行时可以指定参数等.
Cobra 是一个用于创建现代化的 CLI 界面的库, 能提供类似于 git 和 go 工具的能力.
Cobra 的作者就是创建 viper 的作者, 所以这些库都是以 命名的, viper 是蝰蛇, corba 是眼镜蛇.
corba 擅长于聚合多个命令, 它遵循 命令, 参数, 标志 的理念.
APPNAME VERB NOUN --ADJECTIVEAPPNAME COMMAND ARG --FLAG对于我们的 web 项目来说, 目前只有启动这个操作, 所以我们先创建一个主动作.
创建 cmd 目录, 并创建一个名为 root.go 的文件.
&cobra.CommandUseShortLongRuninit()cobra.OnInitialize我在这里设置了一个名为 config 的 flag, 即配置文件对应的路径.
最后, 还需要定义一个函数, 用来包装主命令的执行:
main.gorunServer()热重载
前面定义了一个观察 viper 配置改变的函数, 注意到它有个通道参数, 我使用通道作为消息传递机制.
fsnotify.Event前面都是些常规的运行启动, 包括使用一个 goroutine 检查启动的健康状态, 使用另一个 goroutine 启动服务器.
注意最后几行, 我们在等待通道通知配置文件已经发生了改变, 然后开始先关闭服务器, 最后重新运行启动函数.
注意: 这里可能有个 bug, 那就是修改配置文件后, OnConfigChange 会触发两次, 暂时没有什么好的解决方法. 或者可以考虑一下 github issues 上提到的 限流模式.
总结
这个过程主要研究了如何读取配置文件, 同时也使用了命令行相关的库, 便于以后扩展更多的命令.
当前部分的代码
作为版本 0.2.0