通过内核fanotify监听文件事件实现配置文件热更新

简介: 通过内核的方式实现一遍

前2两篇文章,通过定时器,信号,实现了配置文件热更新


  1. 通过定时器实现配置文件热更新
  2. 通过信号实现配置文件热更新


接下来介绍第三种方式,通过内核fanotify,监听事件变化,来重新加载配置文件


fanotify.go  代码如下

packagemainimport (
"encoding/json""fmt""io/ioutil""log""time""github.com/fsnotify/fsnotify")
//全局自定义拦截varintercept []Intercept//文件时间varftint64varfilenamestring="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)
    }
}
funclisten(w*fsnotify.Watcher) {
err :=w.Add(filename)
iferr!=nil {
log.Fatal(err)
    }
}
funcmain() {
//初始读取Read_resp()
watcher, err :=fsnotify.NewWatcher()
iferr!=nil {
log.Fatal(err)
    }
deferwatcher.Close()
listen(watcher)
gofunc() {
for {
select {
caseevent, ok :=<-watcher.Events:
if!ok {
return                }
log.Println("event:", event)
ifevent.Op&fsnotify.Write==fsnotify.Write {
log.Println("modified file:", event.Name)
Read_resp()
                }
ifevent.Op&fsnotify.Rename==fsnotify.Rename {
listen(watcher)
Read_resp()
                }
caseerr, ok :=<-watcher.Errors:
if!ok {
return                }
log.Println("error:", err)
            }
        }
    }()
//循环打印for {
time.Sleep(1*time.Second)
iflen(intercept) >0 {
fmt.Println(intercept[0].RespBody)
        }
    }
}


配置文件 intercept.json 

[{
"url": "http://testing-ft2x-api.cloudcare.cn/api/v1/workspace/member/list",
"method": "get",
"resp_body": {"msg": "ehhjjj"},
"resp_header": {"Content-Type": "application/json"},
"resp_code": 200}]


运行程序

./fsnotify

然后更改配置文件

[{
"url": "http://testing-ft2x-api.cloudcare.cn/api/v1/workspace/member/list",
"method": "get",
"resp_body": {"msg": "ehhjjjjjjggg"},
"resp_header": {"Content-Type": "application/json"},
"resp_code": 200}]

程序输出

map[msg:ehh]
map[msg:ehh]
map[msg:ehh]
2021/11/13 09:45:22 event: "intercept.json": CHMOD
2021/11/13 09:45:22 event: "intercept.json": WRITE
2021/11/13 09:45:22 modified file: intercept.json
map[msg:ehhjjj]
map[msg:ehhjjj]
map[msg:ehhjjj]
map[msg:ehhjjj]
map[msg:ehhjjj]
map[msg:ehhjjj]
2021/11/13 09:45:29 event: "intercept.json": CHMOD
2021/11/13 09:45:29 event: "intercept.json": WRITE
2021/11/13 09:45:29 modified file: intercept.json
map[msg:ehhjjjjjj]
2021/11/13 09:45:30 event: "intercept.json": CHMOD
2021/11/13 09:45:30 event: "intercept.json": WRITE
2021/11/13 09:45:30 modified file: intercept.json
map[msg:ehhjjjjjjggg]
map[msg:ehhjjjjjjggg]
map[msg:ehhjjjjjjggg]
目录
相关文章
|
4月前
|
Ubuntu Linux
在Linux中,想修改ip,需要编辑哪个配置⽂件?修改完配置⽂件后,如何重启网卡?使配置生效?
在Linux中,想修改ip,需要编辑哪个配置⽂件?修改完配置⽂件后,如何重启网卡?使配置生效?
|
Java Linux Shell
如何在Linux中使SpringBoot项目关闭终端后不关闭项目进程
如何在Linux中使SpringBoot项目关闭终端后不关闭项目进程
141 0
如何在Linux中使SpringBoot项目关闭终端后不关闭项目进程
|
消息中间件 网络协议 关系型数据库
Java应用程序读取外部配置文件
当我们在服务器上安装一些软件服务时,如 MySQL、Kafka、ES 等,在启动服务的时候,脚本会读取默认路径下的配置文件,如果配置文件没有放到默认的路径下,我们也可以通过参数的方式指定,通过这个配置文件,可以灵活方便的开始某些功能或调整某些参数,不用重新对源码进行修改、编译和发布了。 所以,我们工作当中有时希望可以把配置文件放在程序外,这样就可以做到配置与业务分离,在项目中使用的 properties,这里就说一下如何用 properties 配置文件,默认加载 classpath 下的文件,如果通过参数指定了文件路径就可以使用外部配置了。
EMQ
|
算法 网络协议 物联网
配置热更新/支持 Reload、QUIC 桥接再升级
12月,NanoMQ稳步更新,最新的0.15版本将于近期发布,将增加配置热更新功能和Reload命令;MQTT over QUIC桥接再次得到升级,增加了拥塞控制和QoS消息优先传输。
EMQ
221 0
配置热更新/支持 Reload、QUIC 桥接再升级
|
存储 JSON NoSQL
confd动态配置文件详解
confd动态配置文件详解
confd动态配置文件详解
|
Java Linux
Zookeeper安装以及基本服务开启关闭操作指令和配置参数解读
Zookeeper安装以及基本服务开启关闭操作指令和配置参数解读
Zookeeper安装以及基本服务开启关闭操作指令和配置参数解读
|
前端开发
React修改项目启动的默认端口号
React修改项目启动的默认端口号
|
运维 NoSQL Java
从源码研究如何不重启项目实现redis配置动态切换
上一篇Websocket的续篇暂时还没有动手写,这篇算是插播吧。今天讲讲不重启项目动态切换redis服务。
从源码研究如何不重启项目实现redis配置动态切换
|
XML C# 数据格式
C#应用程序配置文件
C#应用程序配置文件
121 0
C#应用程序配置文件
|
UED
通过定时器实现配置文件热更新
配置文件修改及时生效
313 0