pomelo服务器集群中集成http服务器

                项目接近尾声,这个周在弄运维相关的一些东西。
运维部门需要一个http服务器,来查询服务器及玩家的一些数据。

在做的过程中考虑的是两个问题:
1 这个http服务器挂在什么地方?
为了不污染pemelo的代码,做了一个httpServer的组件,在gate服务器中加载。
因为其他服务器可能有多个,这样会重复加载httpServer组件,导致端口重复监听。


2 多个area服务器,如何确定rpc调用的路由?
pomelo默认的路由格则如下:
// game-server/node_modules/pomelo/lib/components/proxy.js
var genRouteFun = function() return function(session, msg, app, cb) {    var routes = app.get('__routes__');    if (!routes) {      defaultRoute(session, msg, app, cb);      return;    }    var type = msg.serverType,      route = routes[type] || routes['default'];    if (route) {      route(session, msg, app, cb);    } else {      defaultRoute(session, msg, app, cb);    }  };};var defaultRoute = function(session, msg, app, cb) var list = app.getServersByType(msg.serverType);  if (!list || !list.length) {    cb(new Error('can not find server info for type:' + msg.serverType));    return;  }  var uid = session ? (session.uid || '') : ''var index = Math.abs(crc.crc32(uid.toString())) % list.length;  utils.invokeCallback(cb, null, list[index].id);};


从代码中可以看到,若没有设置路由规则就调用默认的路由规则。
默认路由规则中,uid决定了所在的服务器。


所以最终代码Demo这样的:
// httpServer
module.exports = function(app, opts) {    return new HttpServer(app, opts);};var HttpServer = function(app, opts) this.app = app;  this.opts = opts;  this.confs = {};  // 指令对应的函数  var confs = {    data: this.onData  };  this.server = http.createServer(function(req, res){    var post = '';    req.on('data', function(chunk) {      post += chunk;    });    req.on('end', function() {      // 从post消息中取得指令      post = querystring.parse(post);      var cmd = post.cmd;      if (!!cmd) {        var func = confs[cmd];        if (!!func) {          func(post.uid, function(ret){            res.write(JSON.stringify(ret));            res.end();          });        } else {        }      }    });  });};HttpServer.name = '__HttpServer__';HttpServer.prototype.start = function(cb) this.server.listen(this.opts.port);  cb();};HttpServer.prototype.afterStart = function(cb) {  cb();};HttpServer.prototype.stop = function(force, cb) this.server.close();  cb();};HttpServer.prototype.onData = function(uid, cb) var servers = pomelo.app.getServersByType('area');  var server = dispatcher.dispatch(uid, servers);  var sid = server.id;  pomelo.app.rpc.area.httpRemote.getUser.toServer(sid, uid, function(res){    cb(res);  });};

参考:
https://github.com/NetEase/pomelo/wiki/rpc%E8%B0%83%E7%94%A8%E5%8E%9F%E7%90%86           
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值