pomelo 서버 집단에 http 서버 통합

2881 단어
프로젝트가 막바지에 가까워지자 이번 주에 운송과 관련된 것들을 하고 있다.
운영 부문은 서버와 유저의 데이터를 조회하기 위해 http 서버를 필요로 한다.
하는 과정에서 고려하는 것은 두 가지 문제이다.
1 이 http 서버는 어디에 있습니까?
pemelo의 코드를 오염시키지 않기 위해 http 서버의 구성 요소를 만들어서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가 있는 서버를 결정합니다.
그래서 최종 코드 데모 이런 거:
//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

좋은 웹페이지 즐겨찾기