pomelo 框架第三部分
项目地址: https://github.com/NetEase/chatofpomelo-websocket.git
分支:tutorial-protobuf
如果发现有错误的地方,请在评论中及时指出,谢谢
一、remote.js的start方法
1. remote初始化
如果此服务器配置包含port端口,则加载remote组件。
进而启动remote组件,方法如下:
pro.start = function (cb) {
this.opts.port = this.app.getCurServer().port;
this.remote = genRemote(this.app, this.opts); // 初始化remote
this.remote.start();
process.nextTick(cb);
};
var genRemote = function (app, opts) {
opts.paths = getRemotePaths(app); // 加载不同的remote路径
opts.context = app;
if (!!opts.rpcServer) { // 根据是否有rpcServer配置进行不同的初始化
return opts.rpcServer.create(opts);
} else {
return RemoteServer.create(opts);
}
};
var getRemotePaths = function (app) {
var paths = [];
var role;
// master server should not come here
if (app.isFrontend()) {
role = 'frontend';
} else {
role = 'backend';
}
var sysPath = pathUtil.getSysRemotePath(role), serverType = app.getServerType();
if (fs.existsSync(sysPath)) {
paths.push(pathUtil.remotePathRecord('sys', serverType, sysPath));
}
var userPath = pathUtil.getUserRemotePath(app.getBase(), serverType);
if (fs.existsSync(userPath)) {
paths.push(pathUtil.remotePathRecord('user', serverType, userPath));
}
return paths;
};
backend paths:
[
{
namespace: 'sys',
serverType: 'chat',
path: '/chatofpomelo-websocket/game-server/node_modules/pomelo/lib/common/remote/backend'
},
{
namespace: 'user',
serverType: 'chat',
path: '/chatofpomelo-websocket/game-server/app/servers/chat/remote'
}
]
frontend paths:
[
{
namespace: 'sys',
serverType: 'connector',
path: /chatofpomelo-websocket/game-server/node_modules/pomelo/lib/common/remote/frontend'
}
]
通过上面的代码,我们得知,remote根据服务器是否为前端服务器进行不同的路径匹配,remote的命名空间分为sys系统级和user用户级两种规则,后续调用remoteServer.create
方法为this.remote
进行初始化赋值,最后调用this.remote.start()
启动remote模块。
2.rpc-server/server.create
module.exports.create = function (opts) {
var services = loadRemoteServices(opts.paths, opts.context); // 根据paths加载相应路径的模块,并进行初始化操作
opts.services = services;
var gateway = Gateway.create(opts); // 初始化网关
return gateway;
};
rpc-server/server
初始化操作:
a: loadRemoteServices 加载了paths中相关的模块。
b: 对于sys 级的类型,加载pomelo/lib/common/remote
下的模块,backend/msgRemote.js、frontend/channelRemote.js、frontend/sessionRemote.js。
c: 对于user 级的类型,加载相应服务下的/remote
里面的自定义模块。
d: 初始化网关
3.初始化gateway
var Gateway = function (opts) {
EventEmitter.call(this);
this.opts = opts || {};
this.port = opts.port || 3050;
this.started = false;
this.stoped = false;
this.acceptorFactory = opts.acceptorFactory || defaultAcceptorFactory;
this.services = opts.services;
var dispatcher = new Dispatcher(this.services); // 初始化调度
if (!!this.opts.reloadRemotes) {
watchServices(this, dispatcher);
}
this.acceptor = this.acceptorFactory.create(opts, function (tracer, msg, cb) { // 初始化接收器
dispatcher.route(tracer, msg, cb); // 调度路由,作为cb对接收器进行赋值cb
});
};
初始化接收器工厂,初始化调度,对于路由来说,通过调度将消息路由到适当的服务对象。
4.调用start
remote中调用start:this.remote.start();
实际上是调用gateway中的start方法。
gateway.js:
pro.start = function () {
this.started = true;
this.acceptor.listen(this.port);
};
gateway调用mqtt-acceptor的listen方法,创建net.Server服务,监听connection字段
mqtt-acceptor.js:
pro.listen = function (port) {
this.inited = true;
var self = this;
this.server = new net.Server();
this.server.listen(port);
this.s