温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何实现nsqlookupd入口文件分析

发布时间:2021-12-29 11:57:43 来源:亿速云 阅读:152 作者:柒染 栏目:云计算

这期内容当中小编将会给大家带来有关如何实现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入口文件分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI