通过信号实现配置文件热更新

简介: 通过信号来实现一遍配置文件热更新

配置文件修改后,要达到及时生效,热加载的目的,那么可以通过2种方式实现

  1. 定时器循环,查看文件更新时间,如果发现有修改,那么重新加载
  2. 监听信号,文件更改后,发送信号,通过捕获信号,再重新加载


例如,线上的应用日志级别为 info ,出现故障后,你需要开启 debug 来排查日志,但是把日志级别改成 debug ,那么你不得不重启应用,可能故障现象就不存在或不好重现了,而且重启服务可能会影响用户体验。


上一篇已经介绍了通过定时器实现配置文件热更新,以下我就介绍另一种信号的方式来实现吧。

signal.go 

packagemainimport (
"encoding/json""fmt""io/ioutil""log""os""os/signal""syscall""time")
//全局自定义拦截varintercept []Interceptvarfilenamestring="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() {
//初始读取Read_resp()
//监听信号sig :=make(chanos.Signal, 1)
signal.Notify(sig, syscall.SIGUSR1)
gofunc() {
for {
select {
//获取到信号,再次执行case<-sig:
Read_resp()
            }
        }
    }()
//循环打印for {
time.Sleep(1*time.Second)
iflen(intercept) >0 {
fmt.Println(intercept[0].RespBody)
        }
    }
}

配置文件

intercept.json 

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


运行程序后,我编辑配置文件内容 resp_body  ,然后手动给进程发送信号

先查找出运行进程的pid

[root@izbp152ke14timzud0du15z signal]# ps -ef|grep signalroot     278002688015:58 pts/1    00:00:00 ./signal
root     2787617301015:58 pts/2    00:00:00 grep--color=auto signal


通过kill给进程发送信号

[root@izbp152ke14timzud0du15z signal]# kill -USR1 27800


程序捕获到信号后,会重新读取配置文件

map[msg:d]
map[msg:d]
map[msg:d]
map[msg:d]
map[msg:ff]
map[msg:ff]
map[msg:ff]
map[msg:ff]
map[msg:ff]
map[msg:ff]
map[msg:dde]
map[msg:dde]
目录
相关文章
|
缓存 前端开发 应用服务中间件
Nginx的原理、常用配置和生产案例应用(二)
Nginx的原理、常用配置和生产案例应用
142 0
|
7月前
|
前端开发
LabVIEW​​开关模块与万用表DMM扫描模式
LabVIEW​​开关模块与万用表DMM扫描模式
53 1
|
5月前
|
存储
Ngnix17---Ngnix服务的信号控制值USR2
Ngnix17---Ngnix服务的信号控制值USR2
|
5月前
|
应用服务中间件 开发工具 nginx
Ngnix18服务的命令行控制
Ngnix18服务的命令行控制
|
缓存 NoSQL 应用服务中间件
Nginx的原理、常用配置和生产案例应用(一)
Nginx的原理、常用配置和生产案例应用
93 0
|
存储 前端开发 Nacos
从源码角度分析 Nacos 配置文件加载以及加载优先级
从源码角度分析 Nacos 配置文件加载以及加载优先级
790 0
|
消息中间件 网络协议 关系型数据库
Java应用程序读取外部配置文件
当我们在服务器上安装一些软件服务时,如 MySQL、Kafka、ES 等,在启动服务的时候,脚本会读取默认路径下的配置文件,如果配置文件没有放到默认的路径下,我们也可以通过参数的方式指定,通过这个配置文件,可以灵活方便的开始某些功能或调整某些参数,不用重新对源码进行修改、编译和发布了。 所以,我们工作当中有时希望可以把配置文件放在程序外,这样就可以做到配置与业务分离,在项目中使用的 properties,这里就说一下如何用 properties 配置文件,默认加载 classpath 下的文件,如果通过参数指定了文件路径就可以使用外部配置了。
修改配置文件,编译freeswitch支持H264
修改配置文件,编译freeswitch支持H264
205 0
|
运维 NoSQL Java
从源码研究如何不重启项目实现redis配置动态切换
上一篇Websocket的续篇暂时还没有动手写,这篇算是插播吧。今天讲讲不重启项目动态切换redis服务。
从源码研究如何不重启项目实现redis配置动态切换
|
UED
通过定时器实现配置文件热更新
配置文件修改及时生效
314 0