在pomelo服务器启动过程 一文中,知道了master服务器是如何启动其他服务器的。那么在最初开始app.start是启动过程又是如何的呢?
可以看看app.start的函数实现:
Application.start = function(cb) {
this.startTime = Date.now();
if(this.state > STATE_INITED) {
utils.invokeCallback(cb, new Error('application has already start.'));
return;
}
var self = this;
appUtil.startByType(self, function() {
appUtil.loadDefaultComponents(self);
var startUp = function() {
appUtil.optComponents(self.loaded, Constants.RESERVED.START, function(err) {
self.state = STATE_START;
if(err) {
utils.invokeCallback(cb, err);
} else {
logger.info('%j enter after start...', self.getServerId());
self.afterStart(cb);
}
});
};
var beforeFun = self.lifecycleCbs[Constants.LIFECYCLE.BEFORE_STARTUP];
if(!!beforeFun) {
beforeFun.call(null, self, startUp);
} else {
startUp();
}
});
};
这里关键的函数appUtil.startByType并没有如我们所想的就调用到了starter.runServers(app);而是直接调用了utils.invokeCallback(cb);那么在startByType的callback中的函数appUtil.optComponents呢?该函数主要是启动了各个载入的组件。这其中就有master组件。只有master服务器会有master组件,而所有服务器都会有monitor组件。optComponents中会调用各个组件的start方法。看看master组件的start方法,正好是调用了master服务器的启动方法start。这样会导致runServers的调用。后续的过程就和pomelo服务器启动过程一致了。