searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Istio的FileWatcher机制解析

2023-08-23 02:26:45
17
0

一、背景

istio在初始化mesh config时,提供了多种配置加载方式,如文件挂载,回退到某个版本(K8s支持)、默认配置三种方式;在初始化网格网络时,也是通过读取NetworksConfigFile来加载网格网络配置;在初始化插件dns证书时为其设置监听。在Pilot discovery service的结构体中,就包含了FileWatcher属性,监听网格MeshConfig、MeshNetwork和Certificates变更事件,动态更新配置。

二、结构

上述结构分为了三层,第一层是FileWatcher结构体,主要提供了添加、删除文件路径以及获取文件事件的接口,这是使用者层面关心的,并不需要关心底层的逻辑实现,针对不同的文件路径名,将实际工作委托给一个workstate的结构体来实现。

在workstate的结构体中也没有具体的实现逻辑,只是封装了添加、删除文件路径的计数和实际执行者worker结构体。

在worker结构体中,终于找到了watcher机制的实现者fsnotify.Watcher结构体,这个是用了第三方工具包fsnotify,fsnotify是一个跨平台的文件系统监控工具,fsnotify的目的是监控某个目录或文件,当有文件被修改或者删除,立马能感知,进行处理。底层原理是操作系统支持,以事件的方式通知到订阅这个事件的用户,达到及时处理的目的。fsnotify库就是封装了系统调用,用来监控文件事件的。当指定目录或者文件,发生了创建,删除,修改,重命名的事件,里面就能得到通知。

三、运行原理

  1. 通过addFileWatcher方法给fileWatcher文件监听器添加监听的文件路径名,如果该文件路径名不存在的话,则初始化worker
  2. 初始化fsnotify的文件监听器,通过操作系统层面监听命名的文件或目录事件
  3. 开启新协程,自旋监听fsnotify的事件
  4. fsnotify文件监听器,监听到文件事件,发送文件事件,通过比较fileTracker中的md5和新生成的文件路径名md5是否一致来决定是否更新path-fileTracker的映射表
  5. 调用方开启的事件监听协程监听到事件触发,根据path查找worker,再找到path-fileTracker映射表,返回对应的文件事件
  6. 触发事件并不执行事件处理函数,而是判断计时器是否存在,不存在则生成一个计时器,这一步是去抖动处理
  7. 计时器到时间触发事件处理函数回调,重置计时器为空
0条评论
0 / 1000