nsqlookupd 入口文件分析

nsq 中 nsqlookupd 角色相對簡單,適合做爲分析 nsq 的入口

apps/nsqlookupd/nsqlookupd.go

nsqlookupd 是一個獨立的程序,因此放到 apps 目錄下,依賴內部包 nsqlookupd, util,外部包:

github.com/BurntSushi/toml      # TOML是一種配置文件規範,此包是golang的解析包

github.com/mreiferson/go-options      # 把命令行和配置文件參數注入到struct中的工具包,只有一個文件

關鍵代碼解析

一、全局變量定義

go 中命令行參數成爲 flag,flag 的集合成爲 FlagSet,解析命令行參數以前須要先建立 FlagSet,定義每個 flag,以下面的全局變量所示,同時提供了重要的默認值

var (
     flagSet = flag.NewFlagSet("nsqlookupd", flag.ExitOnError)

     config      = flagSet.String("config", "", "path to config file")
     ///////////////
)


二、命令行參數解析

flagSet.Parse(os.Args[1:])

os.Args 是全部的命令行參數;os.Args[0] 是執行程序的全路徑名;

flagSet.Parse 解析命令行參數,覆蓋 flagSet 中的 flag 默認定義


三、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()

總結:這種退出方式比較優雅,可以在退出以前作些收尾工做,清理任務和垃圾


四、讀取配置文件

var cfg map[string]interface{}

_, err := toml.DecodeFile(*config, &cfg)

詳細的 toml 使用文檔,參考 toml 的 github


五、建立 nsqlookupd 配置選項的結構體 nsqlookupdOptions

opts := nsqlookupd.NewNSQLookupdOptions()


六、解析命令行參數 flagSet 和 配置文件參數 cfg 到 opts 中

options.Resolve(opts, flagSet, cfg)     // 使用了  go-options  庫

解析時,會查找 opts 定義的 flag tag;優先使用命令行參數,配置文件次之。


七、建立 nsqlookupd 的結構體 NSQLookupd,包含有全部的必要信息,命令行參數 和 默認值

daemon := nsqlookupd.NewNSQLookupd(opts)


八、啓動 nsqlookupd

daemon.Main() 
相關文章
相關標籤/搜索