欢迎光临
我们一直在努力

如何实现nsqlookupd入口文件分析

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

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。