一贯也想用Go来写点什么项目,但github上趴了良久终极也没下决心去实际行动,也是恰巧有一天看到一篇文章先容NSQ实时行列步队的源码剖析,让我有了也要去深入学习的冲动。。。学习大神的代码思想和整体架构
话说我一贯用着天下上最好的措辞PHP,总想深入做个源码剖析,每次都是刚开始就止步于此。。。也想去看看kafka的源码,但是,但可是它利用Scala措辞编写,想看它还得重头来过。
当当当。。。重点来了

当Go涌现让统统变得特殊不一样哈,咱也可以做点高大上的事情了 嚯嚯,难道我这是跪久了,是Golang让我也能站起来,翻身农奴把歌唱赶脚。。。
废话不说了开篇先走一遍流程 NSQ基本先容
基本先容NSQ是由有名短连接做事商bitly用Go措辞开拓的实时处理系统,具有高性能、高可靠、忽略单点故障等优点,是一个非常不错的新兴的行列步队办理方案。NSQ现在发展很快,已有多种措辞的客户端,GO和Python版本的客户端是官方出的,比较给力。
目前NSQ是一个成熟的方案,已在大规模生产环境下运用的产品。
开始进入状态把稳事变nsq利用go modules进行包管理,如对此办法不太理解,请看另一篇文章:http://shuchimao.com/2019/12/10/go-modules利用/ 这里我做了详细先容,以及IDE如何配置利用1. 概述NSQ供应了三大组件以及一些工具,三大组件为:
1.nsqd NSQ紧张组件,用于存储以及分发。2.nsqlookupd 用于管理nsqd集群拓扑,供应查询nsqd主机地址以及做事终极同等性3.nsqadmin 供应了常规管理以及查询集群中topc/channel/node等
2. 准备事情
下载源码:https://github.com/nsqio/nsq
3. 源码目录构造├── Dockerfile # docker脚本 镜像构建├── Gopkg.lock├── Gopkg.toml├── LICENSE├── Makefile # 编译指令集├── README.md├── apps # NSQ运用程序入口干系文件├── bench # 批量测试脚本├── bench.sh # 批量测试脚本├── contrib├── coverage.sh # 覆盖率测试├── dist.sh├── fmt.sh├── go.mod # go modules 源码依赖├── go.sum #供应了安全性校验(自动天生可以不用管它)├── internal # 内部利用的干系包/组件等,对外部不可见├── nsqadmin # 用于管理以及查看集群中的topic、channel、node等信息├── nsqd # NSQ紧张组件,用于存储以及分发├── nsqlookupd # 用于管理nsqd集群拓扑,供应查询nsqd主机地址做事以及做事的终极同等性├── test.sh 测试脚本└── travis.sh # travis脚本
后面会对干系目录逐一展开讲解,紧张剖析目录:apps、nsqadmin、nsqd、nsqlookupd
zhangliang@zhangliang:~/workspace/webapps/golang/weibo/nsq$ tree apps/apps/├── nsq_stat # 节点数据状态│ └── nsq_stat.go├── nsq_tail # 消费数据打印到掌握台│ └── nsq_tail.go├── nsq_to_file # 消费数据到文件│ ├── file_logger.go│ ├── nsq_to_file.go│ ├── options.go│ ├── strftime.go│ └── topic_discoverer.go├── nsq_to_http # 消费数据由http办法发送│ ├── http.go│ ├── nsq_to_http.go│ └── nsq_to_http_test.go├── nsq_to_nsq # 消费数据然后再由其他生产者生产│ └── nsq_to_nsq.go├── nsqadmin # 用于实时查看集群统计数据(并且实行各种各样的管理任务)│ └── main.go├── nsqd # 吸收、分发到消费者客户端│ ├── README.md│ ├── main.go│ ├── main_test.go│ └── options.go├── nsqlookupd # 管理拓扑信息并供应终极同等性的创造做事│ ├── README.md│ └── main.go└── to_nsq ├── README.md └── to_nsq.go
apps目录:运用程序入口干系文件后续重点先展开先容app/nsqd目录来带动其他包nsqd是一个守护进程,卖力吸收、排队、投递给客户端,并不担保的严格顺序,nsqd默认监听一个tcp端口(4150),一个http端口(4151)以及一个可选端口https。。。(这章先带动一下即将要展开剖析的nsqd先容)
有兴趣的各位现在就可以手动利用源码文件来编译一下nsqd,下面我逐一跑跑一次.按照我步骤来绝对能跑起来,我也会把碰着的坑贴出来(实在不是坑,是我学艺不精,对go还是半知半解)。
cd apps/nsqdzhangliang@zhangliang:~/workspace/webapps/golang/weibo/nsq/apps/nsqd$ go build main.go options.gozhangliang@zhangliang:~/workspace/webapps/golang/weibo/nsq/apps/nsqd$ lltotal 21736drwxr-xr-x 7 zhangliang staff 224 12 21 23:24 ./drwxr-xr-x 11 zhangliang staff 352 12 21 22:33 ../-rw-r--r-- 1 zhangliang staff 146 12 21 22:33 README.md-rwxr-xr-x 1 zhangliang staff 11103212 12 21 23:24 main-rw-r--r-- 1 zhangliang staff 1820 12 21 22:33 main.go-rw-r--r-- 1 zhangliang staff 711 12 21 22:33 main_test.go-rw-r--r-- 1 zhangliang staff 8193 12 21 22:33 options.gozhangliang@zhangliang:~/workspace/webapps/golang/weibo/nsq/apps/nsqd$ ./main[nsqd] 2019/12/21 23:24:58.588553 INFO: nsqd v1.2.1-alpha (built w/go1.11.4)[nsqd] 2019/12/21 23:24:58.588635 INFO: ID: 210[nsqd] 2019/12/21 23:24:58.588961 INFO: NSQ: persisting topic/channel metadata to nsqd.dat[nsqd] 2019/12/21 23:24:58.590178 INFO: TCP: listening on [::]:4150[nsqd] 2019/12/21 23:24:58.590253 INFO: HTTP: listening on [::]:4151
编译为二进制文件在运行main
zhangliang@zhangliang:~/workspace/webapps/golang/weibo/nsq/apps/nsqd$ go run main.go options.go[nsqd] 2019/12/21 23:27:10.553048 INFO: nsqd v1.2.1-alpha (built w/go1.11.4)[nsqd] 2019/12/21 23:27:10.553115 INFO: ID: 210[nsqd] 2019/12/21 23:27:10.553841 INFO: NSQ: persisting topic/channel metadata to nsqd.dat[nsqd] 2019/12/21 23:27:10.554708 INFO: TCP: listening on [::]:4150[nsqd] 2019/12/21 23:27:10.554824 INFO: HTTP: listening on [::]:4151
直策应用go run运行
zhangliang@zhangliang:~/workspace/webapps/golang/weibo/nsq/apps/nsqd$ go run ./[nsqd] 2019/12/21 23:28:19.923649 INFO: nsqd v1.2.1-alpha (built w/go1.11.4)[nsqd] 2019/12/21 23:28:19.923720 INFO: ID: 210[nsqd] 2019/12/21 23:28:19.924537 INFO: NSQ: persisting topic/channel metadata to nsqd.dat[nsqd] 2019/12/21 23:28:19.925513 INFO: TCP: listening on [::]:4150[nsqd] 2019/12/21 23:28:19.925887 INFO: HTTP: listening on [::]:4151
或者利用go run ./,这样就不用利用 go run main.go options.go
这里我记录了当时运行时碰着的问题 http://shuchimao.com/2019/12/20/编译nsqd-出错undefined-nsqdflagset/
晓亮 - 期待您的关注嚯嚯,终于迈出了第一步,开遍和准备事情搞定了,相信随着我的脚步您现在可以把nsqd编译出来并已运行。
后续文章将正式开始nsqd源码剖析(实在网上有很多源码剖析,我这个系列重点是剖析每行代码并添加上注释,来看看大牛的代码思想和整体架构)由于本人技能有限,我基本上是手动测试源码,看牛人文章,剖析、摘录、凑集已剖析出来的思路,采取大口语办法书写。。。望各位看官见谅