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中加入的配置函数进行回调。

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

相关推荐
王码码203511 小时前
Go语言中的数据库操作:从sqlx到ORM
后端·golang·go·接口
小羊在睡觉15 小时前
Go与MySQL锁:高并发开发实战指南
数据库·后端·mysql·go
先跑起来再说19 小时前
Gin 从入门到实践:路由与 Context 深入解析
go·gin
小羊在睡觉1 天前
Reids缓存穿透、击穿、雪崩
redis·缓存·go
@atweiwei2 天前
深入解析gRPC服务发现机制
微服务·云原生·rpc·go·服务发现·consul
Mgx4 天前
我在 Mac 写了个服务,硬要它在 18 岁高龄的 Windows 服务器上跑,结果…
go
少林码僧4 天前
1.1 一个架构师竟然这样设计通知平台,解决了所有业务方的痛点!
go
少林码僧4 天前
1.2 太震撼了!多渠道消息适配只用一个设计模式就搞定了?
go
咬_咬4 天前
go语言学习(环境安装,第一个go程序)
开发语言·学习·golang·go·goland
人间打气筒(Ada)5 天前
「码动四季·开源同行」golang:负载均衡如何提高系统可用性?
算法·golang·开源·go·负载均衡·负载均衡算法