溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何實(shí)現(xiàn)nsqlookupd入口文件分析

發(fā)布時(shí)間:2021-12-29 11:57:43 來源:億速云 閱讀:151 作者:柒染 欄目:云計(jì)算

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)如何實(shí)現(xiàn)nsqlookupd入口文件分析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

nsq 中 nsqlookupd 角色相對(duì)簡(jiǎn)單,適合作為分析 nsq 的入口

apps/nsqlookupd/nsqlookupd.go

nsqlookupd 是一個(gè)獨(dú)立的程序,所以放到 apps 目錄下,依賴內(nèi)部包 nsqlookupd, util,外部包:

github.com/BurntSushi/toml      # TOML是一種配置文件規(guī)范,此包是golang的解析包 

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

關(guān)鍵代碼解析

1、全局變量定義

go 中命令行參數(shù)成為 flag,flag 的集合成為 FlagSet,解析命令行參數(shù)之前需要先創(chuàng)建 FlagSet,定義每一個(gè) flag,如下面的全局變量所示,同時(shí)提供了重要的默認(rèn)值

var (

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

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

     ///////////////

)

2、命令行參數(shù)解析

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

os.Args 是所有的命令行參數(shù);os.Args[0] 是執(zhí)行程序的全路徑名;

flagSet.Parse 解析命令行參數(shù),覆蓋 flagSet 中的 flag 默認(rèn)定義

3、nsqlookupd 進(jìn)程退出方式

定義了兩個(gè) chan,signalChan 接收OS發(fā)送的退出信號(hào),匿名協(xié)程收到數(shù)據(jù)時(shí),往 exitChan 發(fā)送一個(gè) 1,此時(shí)等待在 exitChan 上的主協(xié)程調(diào)用 nsqlookupd 的 Exit 方法

signalChan := make(chan os.Signal, 1)

exitChan := make(chan int)

go func() {

    <-signalChan

    exitChan <- 1

}()

// 告訴 golang 運(yùn)行時(shí),收到的退出,中斷信號(hào)傳遞給 signalChan 通道

signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)

<-exitChan     // 等待退出信號(hào)

daemon.Exit()

總結(jié):這種退出方式比較優(yōu)雅,能夠在退出之前做些收尾工作,清理任務(wù)和垃圾

4、讀取配置文件

var cfg map[string]interface{}

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

詳細(xì)的 toml 使用文檔,參考 toml 的 github

5、創(chuàng)建 nsqlookupd 配置選項(xiàng)的結(jié)構(gòu)體 nsqlookupdOptions

opts := nsqlookupd.NewNSQLookupdOptions()

6、解析命令行參數(shù) flagSet 和 配置文件參數(shù) cfg 到 opts 中

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

解析時(shí),會(huì)查找 opts 定義的 flag tag;優(yōu)先使用命令行參數(shù),配置文件次之。

7、創(chuàng)建 nsqlookupd 的結(jié)構(gòu)體 NSQLookupd,包含有所有的必要信息,命令行參數(shù) 和 默認(rèn)值

daemon := nsqlookupd.NewNSQLookupd(opts)

8、啟動(dòng) nsqlookupd

daemon.Main() 

上述就是小編為大家分享的如何實(shí)現(xiàn)nsqlookupd入口文件分析了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI