文档章节

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

大蓝妹
 大蓝妹
发布于 2015/08/27 23:54
字数 594
阅读 1694
收藏 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)

© 著作权归作者所有

共有 人打赏支持
大蓝妹
粉丝 13
博文 11
码字总数 4929
作品 1
其他
人事招聘
NSQ系列之nsqlookupd代码分析四(详解nsqlookupd中的RegitrationDB)

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

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

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

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

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

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

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

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

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

kiwisoft
2016/10/27
22
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ std::function 和 std::bind

C++11提供了std::function和std::bind两个工具,用于引用可调用对象。这些可调用对象包括 普通函数,Lambda表达式,类的静态成员函数,非静态成员函数以及仿函数等。引用可调用对象,可以用于...

yepanl
今天
1
0
python:可迭代对象的索引

关于 python的range的用法: 注意是[ 开始,结束)的半开区间,不包括结束 http://www.runoob.com/python/python-func-range.html import collectionsfrom collections import Iterable字符串......

Oh_really
今天
2
0
docker-compose ,docker-stack

1.例子 version: "3"services: php: image: registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5 ports: - "38080:80" networks: - my_php_mysql volum......

chenbaojun
今天
3
0
SQL_Server2000示例数据库NorthWind的分析(转)

SQL_Server2000示例数据库NorthWind的分析 表名:Categories(食品类别表) 表结构: 字段名称 数据类型 长度 允许为空 CategoryID(主键) int 4 否 CategoryName nvarchar 15 否 Description ...

QQZZFT
今天
1
0
laravel 5.5 Session store not set on request.

laravel 5.5 数据存入session,会出现Session store not set on request.错误。查了下laravel 5.5将session放到global middleware中,需要laravel的文件 ./app/Http/Kernel.php中的加上一句:...

MichaelShu
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部