Go语言是一个看起来平淡无奇,但真正用起来是让人爱不释手的一门语言。
一直也想用Go来写点什么项目,但github上趴了很久最终也没下决心去实际行动,也是碰巧有一天看到一篇文章介绍NSQ实时消息队列的源码分析,让我有了也要去深入学习的冲动。。。学习大神的代码思想和整体架构
话说我一直用着世界上最好的语言PHP,总想深入做个源码分析,每次都是刚开始就止步于此。。。也想去看看kafka的源码,但是,但可是它使用Scala语言编写,想看它还得重头来过。
当当当。。。重点来了
当 go 出现让一切变得特别不一样哈,咱也可以做点高大上的事情了 嚯嚯,难道我这是跪久了,是Golang让我也能站起来,翻身农奴把歌唱赶脚。。。
废话不说了开篇先走一遍流程 NSQ基本介绍
基本介绍
NSQ是由知名短连接服务商bitly用Go语言开发的实时消息处理系统,具有高性能、高可靠、无视单点故障等优点,是一个非常不错的新兴的消息队列解决方案。NSQ现在发展很快,已有多种语言的客户端,GO和Python版本的客户端是官方出的,比较给力。
目前NSQ是一个成熟的方案,已在大规模生产环境下应用的产品。
开始进入状态
注意事项
- nsq使用go modules进行包管理,如对此方式不太了解,请看另一篇文章:使用/ 这里我做了详细介绍,以及IDE如何配置使用
1. 概述
NSQ提供了三大组件以及一些工具,三大组件为:
1.nsqd NSQ主要组件,用于存储消息以及消息分发。
2.nsqlookupd 用于管理nsqd集群拓扑,提供查询nsqd主机地址以及服务最终一致性
3.nsqadmin 提供了常规管理以及查询集群中topc/channel/node等
2. 准备工作
下载源码:
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/nsqd
zhangliang@zhangliang:~/workspace/webapps/golang/weibo/nsq/apps/nsqd$ go build main.go options.go
zhangliang@zhangliang:~/workspace/webapps/golang/weibo/nsq/apps/nsqd$ ll
total 21736
drwxr-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.go
zhangliang@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
这里我记录了当时运行时遇到的问题 编译nsqd-出错undefined-nsqdflagset/
晓亮 – 期待您的关注
嚯嚯,终于迈出了第一步,开遍和准备工作搞定了,相信跟着我的脚步您现在可以把nsqd编译出来并已运行。
后续文章将正式开始nsqd源码分析(其实网上有很多源码分析,我这个系列重点是分析每行代码并添加上注释,来看看大牛的代码思想和整体架构)由于本人技术有限,我基本上是手动测试源码,看牛人文章,分析、摘录、集合已分析出来的思路,采用大白话方式书写。。。望各位看官见谅