Go语言是一个看起来平淡无奇,但真正用起来是让人爱不释手的一门语言。
一直也想用Go来写点什么项目,但github上趴了很久最终也没下决心去实际行动,也是碰巧有一天看到一篇文章介绍NSQ实时消息队列的源码分析,让我有了也要去深入学习的冲动。。。学习大神的代码思想和整体架构
话说我一直用着世界上最好的语言PHP,总想深入做个源码分析,每次都是刚开始就止步于此。。。也想去看看kafka的源码,但是,但可是它使用Scala语言编写,想看它还得重头来过。
当当当。。。重点来了
当Go出现让一切变得特别不一样哈,咱也可以做点高大上的事情了 嚯嚯,难道我这是跪久了,是Golang让我也能站起来,翻身农奴把歌唱赶脚。。。
下面讲解完全是开发角度,如果想试一下NSQ产品,可以到这里 按照教程一步一步走,亲测有效:
https://blog.csdn.net/sd653159/article/details/83624661
废话不说了开篇先走一遍流程 NSQ基本介绍
基本介绍
NSQ是由知名短连接服务商bitly用Go语言开发的实时消息处理系统,具有高性能、高可靠、无视单点故障等优点,是一个非常不错的新兴的消息队列解决方案。NSQ现在发展很快,已有多种语言的客户端,GO和Python版本的客户端是官方出的,比较给力。
目前NSQ是一个成熟的方案,已在大规模生产环境下应用的产品。
开始进入状态
注意事项
- nsq使用go modules进行包管理,如对此方式不太了解,请看另一篇文章:http://shuchimao.com/2019/12/10/go-modules%e4%bd%bf%e7%94%a8/ 这里我做了详细介绍,以及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 # 项目应用的业务代码(暂时可以这么理解)
├── 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
后面会对相关目录逐一展开讲解,主要分析目录: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.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
这里我记录了当时运行时遇到的问题
http://shuchimao.com/2019/12/20/%e7%bc%96%e8%af%91nsqd-%e5%87%ba%e9%94%99undefined-nsqdflagset/
结束
嚯嚯,终于迈出了第一步,开遍和准备工作搞定了,相信跟着我的脚步您现在可以把nsqd编译出来并已运行。
后续文章将正式开始nsqd源码分析(其实网上有很多源码分析,我这个系列重点是分析每行代码并添加上注释,来看看大牛的代码思想和整体架构)由于本人技术有限,我基本上是手动测试源码,看牛人文章,分析、摘录、集合已分析出来的思路,采用大白话方式书写。。。望各位看官见谅
有疑问加站长微信联系(非本文作者)