上一篇: Go消息中間件Nsq系列(一)------初識(shí)Nsq
-
1.Nsq 源碼目錄結(jié)構(gòu)
1.1 首先了解一下
tree命令 查看使用指南, 主要功能是: 創(chuàng)建文件列表,將所有文件以樹(shù)的形式列出來(lái)
mac下安裝brew install tree
` tree ../nsq -L 2` //查看nsq項(xiàng)目結(jié)構(gòu)
```bash
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── ChangeLog.md #更新日志
├── Dockerfile #鏡像構(gòu)建
├── Gopkg.lock
├── Gopkg.toml
├── LICENSE
├── Makefile # 編譯指令集
├── README.md
├── Study.md
├── apps # nsq所有項(xiàng)目
│ ├── nsq_stat # 節(jié)點(diǎn)數(shù)據(jù)狀態(tài)
│ ├── nsq_tail #消費(fèi)數(shù)據(jù)打印到控制臺(tái)
│ ├── nsq_to_file # 消費(fèi)數(shù)據(jù)到文件
│ ├── nsq_to_http # 消費(fèi)數(shù)據(jù)由http方式發(fā)送出去
│ ├── nsq_to_nsq # 消費(fèi)數(shù)據(jù)然后在由其他生產(chǎn)者生產(chǎn)
│ ├── nsqadmin # 用于實(shí)時(shí)查看集群的統(tǒng)計(jì)數(shù)據(jù)(并且執(zhí)行各種各樣的管理任務(wù))。
│ ├── nsqd # 接收消息、分發(fā)消息到消費(fèi)者客戶端
│ ├── nsqlookupd # 管理拓?fù)湫畔⒉⑻峁┳罱K一致性的發(fā)現(xiàn)服務(wù)。
│ └── to_nsq
├── bench # 批量測(cè)試腳本
│ ├── bench.py
│ ├── bench_channels
│ ├── bench_reader
│ ├── bench_writer
│ └── requirements.txt
├── bench.sh # 批量測(cè)試腳本
├── contrib # 配置說(shuō)明
│ ├── nsq.spec # rpm建包腳本
│ ├── nsqadmin.cfg.example
│ ├── nsqd.cfg.example
│ └── nsqlookupd.cfg.example
├── coverage.sh # 覆蓋率測(cè)試
├── dist.sh
├── fmt.sh
├── go.mod # go module
├── go.sum
├── internal # 內(nèi)部實(shí)現(xiàn)代碼,internal對(duì)外部不可見(jiàn)
│ ├── app # 浮點(diǎn)數(shù)組 字符串?dāng)?shù)組工具類
│ ├── auth # 權(quán)限處理
│ ├── clusterinfo # 集群監(jiān)控信息, 比如當(dāng)前版本號(hào),消費(fèi)者,生產(chǎn)者節(jié)點(diǎn)信息操作處理等
│ ├── dirlock # flock 文件鎖類似
│ ├── http_api # http客戶端封裝
│ ├── lg # 日志庫(kù)封裝
│ ├── pqueue # 最小堆實(shí)現(xiàn)的優(yōu)先級(jí)隊(duì)列
│ ├── protocol #系統(tǒng)中任何協(xié)議的基本行為
│ ├── quantile #位數(shù)操作
│ ├── statsd # 統(tǒng)計(jì)
│ ├── stringy #數(shù)組去重,合, 格式化時(shí)間
│ ├── test # 測(cè)試 工具類
│ ├── util #waitgroup, 唯一隨機(jī)數(shù)生成
│ ├── version #版本常量
│ └── writers # 輸出流封裝
├── nsqadmin # nsqadmin實(shí)現(xiàn)
│ ├── README.md
│ ├── bindata.go # go-bind自動(dòng)生成
│ ├── context.go # 上下文
│ ├── gulp # 前端自動(dòng)構(gòu)建工具
│ ├── gulpfile.js # 前端構(gòu)建腳本
│ ├── http.go # http api服務(wù)
│ ├── http_test.go # 測(cè)試
│ ├── logger.go # 日志
│ ├── notify.go # admin操作提醒
│ ├── nsqadmin.go # 主程序
│ ├── nsqadmin_test.go
│ ├── options.go # 配置對(duì)應(yīng)
│ ├── package-lock.json
│ ├── package.json # 前端配置信息
│ ├── static
│ └── test
├── nsqd # 實(shí)現(xiàn)
│ ├── README.md
│ ├── backend_queue.go #后端隊(duì)列接口定義
│ ├── buffer_pool.go # sync.pool 實(shí)現(xiàn)
│ ├── channel.go # channel 實(shí)現(xiàn)
│ ├── channel_test.go
│ ├── client_v2.go # 客戶端一些操作實(shí)現(xiàn)
│ ├── context.go # 上下文
│ ├── dqname.go # 獲取存儲(chǔ)結(jié)構(gòu)名稱
│ ├── dqname_windows.go # 兼容windows文件名 用;號(hào)
│ ├── dummy_backend_queue.go # 假實(shí)現(xiàn)
│ ├── guid.go # 全局唯一id生成參考noeqd和snowflake
│ ├── guid_test.go
│ ├── http.go # http api服務(wù)
│ ├── http_test.go
│ ├── in_flight_pqueue.go # 隊(duì)列
│ ├── in_flight_pqueue_test.go
│ ├── logger.go # 日志
│ ├── lookup.go # lookup 連接操作
│ ├── lookup_peer.go # lookup 連接操作
│ ├── message.go # nsq 消息結(jié)構(gòu)
│ ├── nsqd.go # 主程序
│ ├── nsqd_test.go
│ ├── options.go # 配置
│ ├── protocol_v2.go # nsqd協(xié)議處理
│ ├── protocol_v2_test.go
│ ├── stats.go # 統(tǒng)計(jì)
│ ├── stats_test.go
│ ├── statsd.go # 統(tǒng)計(jì)進(jìn)程
│ ├── tcp.go # tcp 協(xié)議
│ ├── test
│ ├── topic.go # 主題
│ └── topic_test.go
├── nsqlookupd # nsqlookupd 實(shí)現(xiàn)
│ ├── README.md
│ ├── client_v1.go # 客戶端封裝
│ ├── context.go # 上下文
│ ├── http.go # http api服務(wù)
│ ├── http_test.go
│ ├── logger.go
│ ├── lookup_protocol_v1.go # lookup協(xié)議
│ ├── lookup_protocol_v1_test.go
│ ├── nsqlookupd.go # 主程序
│ ├── nsqlookupd_test.go
│ ├── options.go # 配置
│ ├── registration_db.go # 服務(wù)發(fā)現(xiàn)數(shù)據(jù)庫(kù)管理
│ ├── registration_db_test.go
│ └── tcp.go # tcp協(xié)議
├── test.sh # 測(cè)試腳本
└── travis.sh # travis腳本
```
-
2. 可以學(xué)到或者說(shuō)了解一下,需要自己去實(shí)踐
2.1 Travis CI/CD
作為 GitHub MarketPalce 上的一個(gè)產(chǎn)品,目前只支持 GitHub 倉(cāng)庫(kù),私有和共有庫(kù)都可以使用, 只是用私有庫(kù)的時(shí)候需要在環(huán)境遍歷中配置一個(gè) Token, 這個(gè)Token 設(shè)置可以和下面設(shè)置 GitHub Token 、GIT_NAME 等一樣。
2.2 coverage.sh 統(tǒng)計(jì)單元測(cè)試的覆蓋率,也就是白盒測(cè)試的覆蓋率。
還有Go集成 Coveralls.io 代碼覆蓋率持續(xù)跟蹤系統(tǒng) https://github.com/mattn/goveralls
2.3 Makefile 編譯項(xiàng)目腳本 , Dockerfile docker鏡像構(gòu)建腳本 , bench.sh性能測(cè)試腳本等
2.4 go mod (go包管理)的使用
2.5 使用了 go-svc 來(lái)啟動(dòng)nsq的相關(guān)程序,使得在程序退出的時(shí)候可以做一些釋放資源等收尾工作 https://github.com/judwhite/go-svc
2.6 使用了 toml language配置語(yǔ)言,作為配置文件https://github.com/BurntSushi/toml
2.7 使用了testify用go實(shí)現(xiàn)的一個(gè)assert風(fēng)格的測(cè)試框架,這個(gè)包提供了我們需要的斷言的功能,提供了非常豐富的斷言方法。https://github.com/stretchr/testify
2.8 使用了difflib比對(duì)文本之間的差異https://github.com/pmezard/go-difflib
2.9 使用了go-options解析通過(guò)命令行標(biāo)志,配置文件和默認(rèn)結(jié)構(gòu)值設(shè)置的配置值。https://github.com/mreiferson/go-options
2.10 使用了httprouter 高性能路由框架,內(nèi)置實(shí)現(xiàn)算法radix tree https://github.com/julienschmidt/httprouter
2.11 使用go-binddata內(nèi)嵌靜態(tài)資源https://github.com/jteeuwen/go-bindata
2.12 使用了timer_metrics捕獲定時(shí)信息和定期輸出指標(biāo)的有效方法https://github.com/bitly/timer_metrics
2.13 使用了golang編寫的語(yǔ)義版本控制(semver)庫(kù)https://github.com/blang/semver
2.14 Perks contains the Go package quantile that computes approximate quantiles over an unbounded data stream within low memory and CPU bounds.https://github.com/bmizerany/perks
2.15 GoLang變量數(shù)據(jù)結(jié)構(gòu)調(diào)試?yán)?go-spewhttps://github.com/davecgh/go-spew
2.16 使用了snappy 壓縮優(yōu)點(diǎn)是非常高的速度和合理的壓縮率。壓縮率比gzip 小,CPU 占用小。https://github.com/golang/snappy
2.17 go-hostpool 主機(jī)池,使用 epsilon-Greedy算法(?-貪婪算法)實(shí)現(xiàn)負(fù)載https://github.com/bitly/go-hostpool
2.18 backbone.js是一款web前端開(kāi)發(fā)的javascript輕量級(jí)MVC框架;gulp 前端項(xiàng)目構(gòu)建工具等等, 具體查看nsadmin/package.json