首先 master.js中的
Start->[consoleservice.js的start函数]->[moduleUtil.js的startmodules函数]—>[starter.js的runservers函数]
然后在runservers中通读取配置文件,再通过run函数逐个启动服务器。两种方式localrun 或 sshrun starter.js
consoleservice.js的start函数
ConsoleService.prototype.start = function(cb) { if (this.master) { var self = this; this.agent.listen(this.port, function(err) { if (!!err) { utils.invokeCallback(cb, err); return; } exportEvent(self, self.agent, 'register'); exportEvent(self, self.agent, 'disconnect'); exportEvent(self, self.agent, 'reconnect'); process.nextTick(function() { utils.invokeCallback(cb); }); }); } else { logger.info('try to connect master: %j, %j, %j', this.type, this.host, this.port); this.agent.connect(this.port, this.host, cb); exportEvent(this, this.agent, 'close'); } exportEvent(this, this.agent, 'error'); for (var mid in this.modules) { this.enable(mid); } };
这里面如果是主服务器,那么就监听listen指定端口。而非主服务器那么就连接connect到master 貌似是使用到了masteragent模块[低层实现未知,应该是使用的socket]。
系统启动过程,其实可以从启动打印的信息中看出端倪。
首先应该说是,执行node app时,是建立了master服务器,之后从打印信息中可以看到
[2014-10-13 13:53:18.673] [INFO] pomelo - [/home/xx/workspace/XTMJMaster/game-server/node_modules/pomelo/lib/master/starter.js] Executing /usr/local/bin/node /home/xx/workspace/XTMJMaster/game-server/app,env=development,id=connector-server-1,host=127.0.0.1,port=3150,clientPort=3010,frontend=true,serverType=connector locally [2014-10-13 13:53:18.695] [INFO] pomelo - [/home/xx/workspace/XTMJMaster/game-server/node_modules/pomelo/lib/master/starter.js] Executing /usr/local/bin/node /home/xx/workspace/XTMJMaster/game-server/app,env=development,id=logic-server-1,host=127.0.0.1,port=3151,serverType=logic locally [2014-10-13 13:53:18.704] [INFO] pomelo - [/home/xx/workspace/XTMJMaster/game-server/node_modules/pomelo/lib/master/starter.js] Executing /usr/local/bin/node /home/x/workspace/XTMJMaster/game-server/app,env=development,id=auth-server-1,host=127.0.0.1,port=3152,serverType=auth locally
后续又启动了三个服务器,就是使用spawn来启动了3个进程。这样算上之前的总共就有了四个进程。
这点可以从系统的进程信息中得到验证。
Master组件的启动过程,我们可以从官方的文档中找到相关说明:
master组件的启动
master服务器总是率先启动,Master组件在其start调用的最后才会调用Starter.start,Starter.start才会启动所有的应用服务器,因此Master组件总是最先start。在Master组件的start调用中,会完成以下几步:
加载注册Module到MasterConsoleService,Module的导出方式有两种,可以导出工厂函数,也可以导出对象,如果导出工厂函数的话,其签名应该是 FacFunc(opts, ConsoleServicee),其中opts是用户调用app.registerAdmin的时候传入的,ConsoleService则是具体的加载注册Module的MasterConsoleService。
在加载注册完所有的Module后,会开启MasterAgent对端口的监听,此时,master就已经可以接收来自monitor和client的request和notify了。
开启监听后,MasterConsoleService会enable所有的module,这步操作主要是看看有没有module配置了周期性地拉去monitor信息,也就是module的配置中有type选项和interval选项,且type的值为'pull',interval指定了周期,则认为其配置了周期性监控操作,此时会完成周期性事件的调度,使得master可以周期性地获取监控信息。
最后如果有Module定义了start回调,将会在这里调用,一般在start回调里会做一些初始化信息。经历了这些步骤后,master完成启动。
大致是这么个流程。
语言组织的比较乱,见谅。
更多资料可以参考如下链接
http://blog.csdn.net/youyudehexie/article/details/8719408