文档章节

NSQ系列之nsqlookupd代码分析一(初探nsqlookup)

大蓝妹
 大蓝妹
发布于 2015/08/27 23:54
字数 594
阅读 1807
收藏 22

NSQ系列之nsqlookupd代码分析一(初探nsqlookup)

nsqlookupd 是守护进程负责管理拓扑信息。客户端通过查询 nsqlookupd 来发现指定话题(topic)的生产者,并且提供 nsqd 节点广播话题(topic)和通道(channel)信息。

nsqlookupd 有两个接口:TCP 接口,nsqd 用它来广播。HTTP 接口,客户端用它来发现和管理。

本系列的代码分析均是基于nsq v0.3.5的代码进行的分析,如有不对之处欢迎大家指正指导。

nsqlookup struct分析

代码文件路径为nsq/nsqlookupd/nsqlookupd.go

type NSQLookupd struct {
	sync.RWMutex   			//读写锁
	opts         *Options  //nsqlookupd 配置信息 定义文件路径为nsq/nsqlookupd/options.go
	tcpListener  net.Listener 
	httpListener net.Listener 
	waitGroup    util.WaitGroupWrapper //WaitGroup 典型应用 用于开启两个goroutine,一个监听HTTP 一个监听TCP
	DB           *RegistrationDB //product 注册数据库 具体分析后面章节再讲
}

//初始化NSQLookupd实例
func New(opts *Options) *NSQLookupd {
	n := &NSQLookupd{
		opts: opts,
		DB:   NewRegistrationDB(), //初始化DB实例
	}
	n.logf(version.String("nsqlookupd"))
	return n
}


func (l *NSQLookupd) Main() {
	ctx := &Context{l} //初始化Context实例将NSQLookupd指针放入Context实例中 Context结构请参考文件nsq/nsqlookupd/context.go Context用于nsqlookupd中的tcpServer 和 httpServer中

	tcpListener, err := net.Listen("tcp", l.opts.TCPAddress) //开启TCP监听
	if err != nil {
		l.logf("FATAL: listen (%s) failed - %s", l.opts.TCPAddress, err)
		os.Exit(1)
	}
	l.Lock()
	l.tcpListener = tcpListener
	l.Unlock()
	tcpServer := &tcpServer{ctx: ctx} //创建一个tcpServer tcpServer 实现了nsq/internal/protocol包中的TCPHandler接口
	l.waitGroup.Wrap(func() {
            //protocol.TCPServer方法的过程就是tcpListener accept tcp的连接
            //然后通过tcpServer中的Handle分析报文,然后处理相关的协议
		protocol.TCPServer(tcpListener, tcpServer, l.opts.Logger)
	}) //把tcpServer加入到waitGroup

	httpListener, err := net.Listen("tcp", l.opts.HTTPAddress) //开启HTTP监听
	if err != nil {
		l.logf("FATAL: listen (%s) failed - %s", l.opts.HTTPAddress, err)
		os.Exit(1)
	}
	l.Lock()
	l.httpListener = httpListener
	l.Unlock()
	httpServer := newHTTPServer(ctx) //创建一个httpServer
	l.waitGroup.Wrap(func() {
		http_api.Serve(httpListener, httpServer, "HTTP", l.opts.Logger)
	}) //把httpServer加入到waitGroup
}


//NSQLookupd退出
func (l *NSQLookupd) Exit() {
	if l.tcpListener != nil {
		l.tcpListener.Close() //关闭tcpListener
	}

	if l.httpListener != nil {
		l.httpListener.Close() //关闭httpListener
	}
	l.waitGroup.Wait()
}

这一章节的代码就先分析到这里了,下一章节要分析的是nsqlookup中的tcpServer.

第二章传送门 NSQ系列之nsqlookupd代码分析二(初识nsqlookupd tcpServer)

© 著作权归作者所有

大蓝妹

大蓝妹

粉丝 14
博文 11
码字总数 4929
作品 1
其他
人事招聘
私信 提问
NSQ系列之nsqlookupd代码分析四(详解nsqlookupd中的RegitrationDB)

NSQ系列之nsqlookupd代码分析四(详解nsqlookupd中的RegitrationDB操作方法) 上一章我们大致了解了的中的协议的处理逻辑,里面有提到一个存储的以及 数据信息的的一些操作方法。今天我们就来...

大蓝妹
2015/09/02
295
2
NSQ系列之nsqlookupd代码分析二(初识nsqlookupd tcpServer)

NSQ系列之nsqlookupd代码分析二(初识nsqlookupd tcpServer) 在上一章初探中了解到,中开启了一个 和一个 ,那么今天我们来初步了解下。 废话不多说,直接上代码吧,简单粗暴点比较好。 通过...

大蓝妹
2015/08/29
506
0
NSQ系列之nsqlookupd代码分析三(详解tcpServer 中的IOLoop方法)

NSQ系列之nsqlookupd代码分析三(详解nsqlookupd tcpServer 中的IOLoop) 上一章我们大致了解了中的的大致的代码,与client也就之间协议处理在这个方法中,今天我们就分析一下这个方法 废话不...

大蓝妹
2015/09/01
671
0
nsqlookupd 入口文件分析

nsq 中 nsqlookupd 角色相对简单,适合作为分析 nsq 的入口 apps/nsqlookupd/nsqlookupd.go nsqlookupd 是一个独立的程序,所以放到 apps 目录下,依赖内部包 nsqlookupd, util,外部包: gi...

智深
2014/07/31
452
0
去中心化分布式服务实时消息平台-NSQ

NSQ是一个基于Go语言的开源的分布式实时消息平台 NSQ可用于大规模系统的实时消息服务,它的设计目标是为在分布式环境下提供一个强大的去除中心化的分布式服务架构,可以每天处理数以亿计的实...

kiwisoft
2016/10/27
229
0

没有更多内容

加载失败,请刷新页面

加载更多

好程序员web前端教程分享常见基础面试题之性能优化

  好程序员web前端教程分享常见基础面试题之性能优化,为了能够更快的通过企业面试,很多人都会背面试题,而性能优化是每一个企业都会问到的问题,今天就给大家分享一下。   性能优化(Op...

好程序员官网
22分钟前
5
0
面试题必问:spring MVC工作流程图

先看下我在网上找的一张图片,图虽然不是很好看但是很详细很清晰 具体解答 用户向服务器发送请求,请求被spring的核心组件DispatcherServlet截获 DispatcherServlet对请求URL进行解析,得到U...

shiliang_feng
22分钟前
6
0
centos7编译安装php7

安装依赖 [root@localhost ~]# yum -y install gcc gcc++ gcc-c++ wget make libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel bison au......

请叫我足下
22分钟前
5
0
处理Unicode字符 \u202E 问题

这么一段字符串,实际内容应该是123abc456,在获取到的时候就变成下面的内容,肯定要处理呀.... 又得手撸了代码了\u202E : 会将字符串进行翻转,\u202D : 会将字符串互换位置,但为什么从...

小象鸭
28分钟前
4
0
怎么用视频转换器把qsv格式转换成mp4

随着生活水平不断提高消费水平也在不断的增长,与此同时娱乐已经成为了人们生活中重要的一环,在看一些视频时是否会发现例如qsv、qlv和kux等格式是不能用别的播放器打开的,其实这几个格式分...

cenfeng123
36分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部