这期内容当中小编将会给大家带来有关如何实现nsqlookupd入口文件分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
nsq 中 nsqlookupd 角色相对简单,适合作为分析 nsq 的入口
apps/nsqlookupd/nsqlookupd.go
nsqlookupd 是一个独立的程序,所以放到 apps 目录下,依赖内部包 nsqlookupd, util,外部包:
github.com/BurntSushi/toml # TOML是一种配置文件规范,此包是golang的解析包
github.com/mreiferson/go-options # 把命令行和配置文件参数注入到struct中的工具包,只有一个文件
关键代码解析
1、全局变量定义
go 中命令行参数成为 flag,flag 的集合成为 FlagSet,解析命令行参数之前需要先创建 FlagSet,定义每一个 flag,如下面的全局变量所示,同时提供了重要的默认值
var (
flagSet = flag.NewFlagSet("nsqlookupd", flag.ExitOnError)
config = flagSet.String("config", "", "path to config file")
///////////////
)
2、命令行参数解析
flagSet.Parse(os.Args[1:])
os.Args 是所有的命令行参数;os.Args[0] 是执行程序的全路径名;
flagSet.Parse 解析命令行参数,覆盖 flagSet 中的 flag 默认定义
3、nsqlookupd 进程退出方式
定义了两个 chan,signalChan 接收OS发送的退出信号,匿名协程收到数据时,往 exitChan 发送一个 1,此时等待在 exitChan 上的主协程调用 nsqlookupd 的 Exit 方法
signalChan := make(chan os.Signal, 1)
exitChan := make(chan int)
go func() {
<-signalChan
exitChan <- 1
}()
// 告诉 golang 运行时,收到的退出,中断信号传递给 signalChan 通道
signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
<-exitChan // 等待退出信号
daemon.Exit()
总结:这种退出方式比较优雅,能够在退出之前做些收尾工作,清理任务和垃圾
4、读取配置文件
var cfg map[string]interface{}
_, err := toml.DecodeFile(*config, &cfg)
详细的 toml 使用文档,参考 toml 的 github
5、创建 nsqlookupd 配置选项的结构体 nsqlookupdOptions
opts := nsqlookupd.NewNSQLookupdOptions()
6、解析命令行参数 flagSet 和 配置文件参数 cfg 到 opts 中
options.Resolve(opts, flagSet, cfg) // 使用了 go-options 库
解析时,会查找 opts 定义的 flag tag;优先使用命令行参数,配置文件次之。
7、创建 nsqlookupd 的结构体 NSQLookupd,包含有所有的必要信息,命令行参数 和 默认值
daemon := nsqlookupd.NewNSQLookupd(opts)
8、启动 nsqlookupd
daemon.Main()
上述就是小编为大家分享的如何实现nsqlookupd入口文件分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。