首先提出问题:
1.组件Remote是什么?
2.Remote的作用是什么?
remote模块是远程通讯模块服务端监听模块,作用是作为各个模块间通讯对象的存在。
remote对象在app.components._remote_ 变量中保存.
/**
* Get remote paths from application
*
* @param {Object} app current application context
* @return {Array} paths
*
*/
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;
};
/**
* Generate remote server instance
*
* @param {Object} app current application context
* @param {Object} opts contructor parameters for rpc Server
* @return {Object} remote server instance
*/
var genRemote = function(app, opts) {
opts.paths = getRemotePaths(app);
opts.context = app;
if(!!opts.rpcServer) {
return opts.rpcServer.create(opts);
} else {
return RemoteServer.create(opts);
}
};
remote使用rpc协议,作为rpc服务端存在。
/**
* Remote component lifecycle function
*
* @param {Function} cb
* @return {Void}
*/
pro.start = function(cb) {
this.opts.port = this.app.getCurServer().port;
this.remote = genRemote(this.app, this.opts);
this.remote.start();
process.nextTick(cb);
};
在start函数中,genRemote实现了rpc协议的配置和监听。
此外,需要注意的是Remote逻辑js设置有两个地方。
一个是作为系统调用,sys,对应了pomelo/lib/common/remote路径下的backend或者frontend,是哪一个路径取决于当前的服务器是前端服务器还是后端服务器,也就是说在server.json中配置好的每项中的frontend元素是true还是false。
还有一个是用户调用,user,对应了app/servers/服务器类型名/remote下的各js文件。