通过内核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]
目录
打赏
0
0
0
0
4
分享
相关文章
二维坐标系空间变换(详细解读,附MATLAB代码)
二维坐标系空间变换(详细解读,附MATLAB代码)
1342 0
二维坐标系空间变换(详细解读,附MATLAB代码)
web项目规范配置(husky、eslint、lint-staged、commit)
通过上述配置,可以确保在Web项目开发过程中自动进行代码质量检查和规范化提交。Husky、ESLint、lint-staged和Commitlint共同作用,使得每次提交代码之前都会自动检查代码风格和语法问题,防止不符合规范的代码进入代码库。这不仅提高了代码质量,还保证了团队协作中的一致性。希望这些配置指南能帮助你建立高效的开发流程。
295 5
radosgw高可用对象存储网关实战指南
关于radosgw高可用对象存储网关的实战指南,涵盖了从基本概念到具体操作案例,再到架构设计和使用技巧的全面介绍。
205 6
LDAP学习笔记之五:LDAP客户端实现系统帐号验证
LDAP学习笔记之五:LDAP客户端实现系统帐号验证
持续集成/持续部署(CI/CD)的最佳实践
【6月更文挑战第19天】CI/CD最佳实践概括: 确定CI(集成早期发现错误)和CD(自动化部署)概念,选择适配团队的工具如Jenkins、GitLab CI;编写自动化测试,确保每次提交时运行;实行代码审查和质量检查;自动化构建与部署,利用容器技术;建立监控与反馈机制,快速响应问题;采用分支策略如特性分支和拉取请求;持续学习与改进流程,优化效率和质量。
转发路由器 Transit Router体验评测
从初识到动手实操,全方面了解转发路由器 Transit Router
60994 26
转发路由器 Transit Router体验评测
【阿里云产品测评】揭秘阿里云向量检索服务:赋予智能时代搜索新“维度”
【1月更文挑战第3天】在数字化洪流席卷全球的今天,信息的表达与检索方式正在悄然变革。从字符到图像,再到复杂的多维度数据,我们正在步入一个深度理解、精准匹配的智能搜索新时代。此刻,阿里云推出的向量检索服务正以前沿技术之力,引领这一领域的创新潮流。 阿里云向量检索服务,内核采用自研的Proxima引擎,其强大之处在于能够实现水平拓展、全托管和云原生的高效向量检索。这就好比构建了一个可以无限延伸的“知识宇宙”,无论是大规模图像识别、语音识别模型生成的特征向量,还是复杂的大模型知识库结构化信息,都能通过向量化的形式被管理和高效检索。
【Spring】org.springframework.util.StringUtils工具类中commaDelimitedListToStringArray的使用
【Spring】org.springframework.util.StringUtils工具类中commaDelimitedListToStringArray的使用
134 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等