使用 本地文件 作为 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
中加入的配置函数进行回调。
以上实现了对本地配置文件的配置以及监听过程的源码分析。日志文件输出如下