pomelo 서버 집단에 http 서버 통합
운영 부문은 서버와 유저의 데이터를 조회하기 위해 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.