Kitex源码解析:本地文件作为 Kitex 的服务治理配置中心部分

使用 本地文件 作为 Kitex 的服务治理配置中心主要包括创建开启文件监听器(FileWatcher)以及配置监听的引用。目前本地配置文件默认支持json和yaml类型的数据。 以client端为例,

文件监听器

创建clien端之前需要通过filepath创建一个文件监视器对象,调用 fw.StartWatching() 方法开始监视文件变化,并且开启一个携程通过 <-sig 接收信号使程序退出时调用fw.StopWatching() 停止文件监视器。

NewFileWatcher 函数对fileWather 进行初始化,首先判断路径是否存在,确认之后返回初始化的fileWather。

示例目录下filepath = "kitex_client.json",如果是windows系统需要改为filepath = " client\kitex_client.json" 创建fileWather之后调用StartWatching 方法监听文件变化。

通过互斥锁确保文件添加时的线程安全,并且通过协程中fw.start() 方法开始监视文件的变化。

使用 select 语句处理多个通道的事件:

  • 如果接收到的事件为文件写入事件 (fsnotify.Write)(文件修改时触发),则调用 fw.CallOnceAll() 方法,这个方法用于执行所有注册的回调函数
  • 如果接收到的事件为文件删除事件 (fsnotify.Remove),记录并且停止文件监视器的工作。
  • 如果监视器的错误通道 (fw.watcher.Errors) 中有错误产生,记录错误信息,停止监视。
  • 如果接收到 fw.done 则退出循环,停止监视。

fsnotify.Write触发后,调用CallOnceAll()用回调函数列表中的所有回调函数一次,使用 os.ReadFile(fw.filePath) 读取文件的内容到变量 data 中,之后遍历回调函数列表 fw.callbacks并传入文件的内容 data。如果是空函数则注销掉。

配置监听的引用

创建一个 Echo 服务的客户端并且添加指定的配置。

NewClient 函数中,创建options空切片,并且加入WithDestService 函数用于配置目标服务以及传入的配主函数,并以此创建client.NewClient()

NewClient 函数,用于创建一个 kitex.Client 对象,创建kClient结构体,并且其中opt 字段是一个指向客户端选项的指针,存储了客户端的配置选项。通过client.NewOptions(opts) 函数创建一个新的客户端选项对象 opt

NewOptions 函数创建一个新的 Options 对象 o,并初始化其中的各个字段,并且调用 Apply() 方法,将传入的配置应用到选项对象 o 上。

Apply() 方法中,遍历所有的选项,并逐个调用。对此我们分析WithSuite()的配置。

这个传入的Suite为之前创建client中通过kitexclient.WithSuite(fileclient.NewSuite(serviceName, key, fw)),创建的。

因此在初始化NewSuite时,初始化其对应的文件监视器monitor.ConfigMonitor

并且根据文件类型配置对应的默认解析器。

之后我们回到WithSuite()函数中,发现其通过遍历选项套件中的所有选项suite.Options(),可以完成一系列的配置操作。

Options()之中,首先调用 s.watcher.SetManager(&parser.ClientFileManager{}),设置了文件监视器。 然后在选项切片 opts 中添加一系列client端可以配置的治理策略:

  • 使用 WithRetryPolicy() 函数设置重试策略。
  • 使用 WithCircuitBreaker() 函数设置熔断策略。
  • 使用 WithRPCTimeout() 函数设置超时策略。
  • 使用 WithDegradation() 函数设置降级策略。
  • 使用 kitexclient.WithCloseCallbacks() 函数添加了关闭回调函数选项,当客户端关闭时,会执行该回调函数来停止文件监视器。 最后,调用 s.watcher.Start() 方法启动文件监视器。

configMonitor 结构体的 Start() 方法,通过fileWatcher.RegisterCallback()parseHandler函数注册到fileWatcher中的回调函数列表,并且返回函数id,使得当监视器监视文件发生变化时,进行回调。并且在注册之后通过fileWatcher.CallOnceSpecific进行一次回调,完成初始的配置。

configMonitor 结构体的 parseHandler 方法实现了文件的解析以及对configMonitor 结构的callbacks中加入的配置函数进行回调。

以上实现了对本地配置文件的配置以及监听过程的源码分析。日志文件输出如下

相关推荐
研究司马懿17 小时前
【云原生】Gateway API高级功能
云原生·go·gateway·k8s·gateway api
梦想很大很大1 天前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰1 天前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘2 天前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤2 天前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt112 天前
AI DDD重构实践
go
Grassto4 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto5 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室6 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题6 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo