基本使用
主要就是来读写配置文件的,和方便的库,应该说是目前go语言中 最成熟的一个配置方案了
github.com/spf13/viper
唯一要注意的是 vipe的 设置是有优先级的,另外对于设置的key也是大小写不敏感的
我们可以简单配置一个文件:
简单使用:
1 | go复制代码func main() { |
除了读配置文件 我们当然也可以写入配置文件
1 | javascript复制代码viper.Set("age", "181") |
还可以监控配置文件的变化:
1 | go复制代码viper.WatchConfig() |
另外viper还可以支持 远程读取配置信息 比如读取etcd的配置信息
viper一样也支持访问环境变量,有兴趣的可以读一下文档,我这里因为不喜欢操作环境变量。所以就再演示了
viper 读值要注意的事项
没有配置的 会返回0值,所以我们一般用isSet来判断
1 | arduino复制代码if !viper.IsSet("house") { |
嵌套的key 可以用 . 来做分隔符
1 | less复制代码fmt.Println(viper.Get("address.location")) |
也可以直接序列化
json 形如:
1 | json复制代码{ |
定义结构体
1 | go复制代码type Config struct { |
1 | arduino复制代码var config Config |
当然这个结构体还可以用mapstructure 来定义
1 | go复制代码type Config2 struct { |
优雅关机与重启
当我们的web服务程序需要更新的时候,通常都是杀掉进程,然后重启即可。但是这样做稍微有点粗鲁,因为假设你杀进程的时候。有请求进来 那么此时进程被杀,这个请求的发起方的体验会很差。
理想种的情况是 我们kill这个web进程的时候 可以 这个web服务可以把手机的活全干完(已经连接上请求,但是程序仍旧在执行 还没有response) 然后再kill自己。
1 | go复制代码func main() { |
实验也很好做,我们在浏览器中访问一个web连接,这个时候gin的代码里我们设置好了要5秒以后才给返回,
然后我们ctrl c kill掉这个进程 你就会发现,程序不是马上就死的,而时等响应之后 才会kill掉自己
浏览器里面也能正常获得响应
同样的 做到优雅重启也不难
原理就是 当收到信号的时候,我们先fork 一个子进程出来,父进程你就干你还没干完的事情就可以了,
这个时候 新的请求都会到这个 子进程来,等父进程活干完以后 就自己结束就行了
有兴趣的话可以看 github.com/fvbock/endl…
要注意的是如果用了supervisor 类似的进程管理工具 则不需要做优雅重启,只需要稍微关心下优雅关机即可
本文转载自: 掘金