15

golang nsq源码分析&添加中文注释系列(一)

 4 years ago
source link: https://studygolang.com/articles/25536
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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是一个成熟的方案,已在大规模生产环境下应用的产品。

开始进入状态

注意事项

  1. 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

结束

嚯嚯,终于迈出了第一步,开遍和准备工作搞定了,相信跟着我的脚步您现在可以把nsqd编译出来并已运行。

后续文章将正式开始nsqd源码分析(其实网上有很多源码分析,我这个系列重点是分析每行代码并添加上注释,来看看大牛的代码思想和整体架构)由于本人技术有限,我基本上是手动测试源码,看牛人文章,分析、摘录、集合已分析出来的思路,采用大白话方式书写。。。望各位看官见谅

我的博客: http://shuchimao.com/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK