配置文件修改后,要达到及时生效,热加载的目的,那么可以通过2种方式实现
- 定时器循环,查看文件更新时间,如果发现有修改,那么重新加载
- 监听信号,文件更改后触发信号,通过捕获信号,再重新加载
例如,线上的应用日志级别为 info
,出现故障后,你需要开启 debug
来排查日志,但是把日志级别改成 debug
,那么你不得不重启应用,可能故障现象就不存在或不好重现了,而且重启服务可能会影响用户体验。
以下我就介绍一种定时器循环的方式来实现吧。
packagemainimport ( "encoding/json""fmt""io/ioutil""log""os""time") //全局自定义拦截varintercept []Intercept//文件时间varftint64varfilenamestring="/Users/jiangyd/mygo/src/gi/intercept.json"typeInterceptstruct { Urlstring`json:"url"`Methodstring`json:"method"`RespHeadermap[string]string`json:"resp_header"`RespBodyinterface{} `json:"resp_body"`RespCodeint`json:"resp_code"`} //读取自定义响应文件funcRead_resp() { intercept_data, err :=ioutil.ReadFile(filename) iferr!=nil { log.Fatalln(err) } err=json.Unmarshal(intercept_data, &intercept) iferr!=nil { log.Fatalln(err) } } funcmain() { //启用定时器t :=time.NewTicker(1*time.Second) gofunc() { for { _, ok :=<-t.Cifok { fileinfo, err :=os.Stat(filename) iferr!=nil { fmt.Println(err) } iffileinfo.ModTime().UnixNano() >ft { Read_resp() ft=fileinfo.ModTime().UnixNano() } } } }() //循环打印for { time.Sleep(1*time.Second) iflen(intercept)>0{ fmt.Println(intercept[0].RespBody) } } }
配置文件
[{ "url": "http://test.cloudcare.cn/api/v1/workspace/member/list", "method": "get", "resp_body": {"msg": "c"}, "resp_header": {"Content-Type": "application/json"}, "resp_code": 200}]
运行程序后,我编辑配置文件内容 resp_body
可以被重新加载到
map[msg:m] map[msg:a] map[msg:a] map[msg:a] map[msg:b] map[msg:c] map[msg:c]