pomelo 框架第三部分 remote/proxy服务

本文详细解析了Pomelo框架中的remote.js和proxy.js组件,包括remote的start方法,涉及加载远程服务、初始化gateway和调用start等步骤。同时,介绍了proxy的afterStart方法,涵盖初始化操作、生成proxy服务以及rpcInvoke方法的调用过程。总结了user级rpc服务的完整调用流程,从Handler的rpc方法到远程服务方法的执行,展示了Pomelo框架中的RPC通信机制。
摘要由CSDN通过智能技术生成

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.jsfrontend/channelRemote.jsfrontend/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.serv
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值