Pomelo交流群 @老顽童-NextZeus 微信群 BJ NodeJS Club @老顽童
npm install pomelo -g
pomelo init helloWorld
cd helloWorld & sh npm-install.sh
cd game-server & pomelo start
cd web-server & node app.js
var pomelo = require('pomelo);
var app = pomelo.createApp();
//
app.configure(,, function(){
//
app.before(pomelo.filters.toobusy());//接口访问限制
app.filter(pomelo.filters.serial()); // configure builtin filter: serialFilter
app.filter(pomelo.filters.time()); //开启conn日志,对应pomelo-admin模块下conn request
app.rpcFilter(pomelo.rpcFilters.rpcLog());//开启rpc日志,对应pomelo-admin模块下rpc request
//
app.enable('systemMonitor');
//
//
var onlineUser = require('./app/modules/onlineUser');
if (typeof app.registerAdmin === 'function') {
app.registerAdmin(onlineUser, {app: app});
}
//
app.loadConfig('mysql', app.getBase() + '/config/mysql.json');
//
app.route('chat', routeUtil.chat);
// proxy configures
app.set('proxyConfig', {
cacheMsg: true,
interval: 30,
lazyConnection: true
enableRpcLog: true
});
// remote configures
app.set('remoteConfig', {
cacheMsg: true,
interval: 30
});
//
app.set('connectorConfig',{
connector: pomelo.connectors.hybridconnector,
heartbeat: 30,
useDict: true,
useProtobuf: true,
handshake: function (msg, cb) {
cb(null, {});
}
});
//
app.set(key,value);
//
app.load(helloWorldComponent, opt)
//
var statusPlugin = require('pomelo-status-plugin');
app.use(statusPlugin, {
status:{
host: '127.0.0.1',
port: 6379
}
});
//
app.start();
});
process.on('uncaughtException', function(err){
console.error('uncaughtException : ', err, err.stack());
});
运行架构说明:
游戏服务器端,往往需要处理大量的各种各样的任务,比如:管理客户端的连接,维护游戏世界端状态,执行游戏的逻辑等等 每一项任务所需的系统资源也可能不同,如:IO密集或CPU密集等。 而这些复杂的任务只有一个单独的服务器进程很难支撑和管理起来的。所以游戏服务器往往是由多个类型的服务器进程组成的集群。 每隔服务器进程专注于一块具体的业务,如:连接服务,场景服务,聊天服务等。这些服务器进程相互协作,对外提供完整的游戏服务
由于存在上述的复杂性,,游戏服务器端的开发者往往需要花费大量的时间精力在诸如服务器类型的划分,进程数量的分配,以及这些 进程的维护,进程间的通讯,请求的路由等等这些底层的问题上。 而这些都是一些重复而繁琐的工作。pomelo则是为解决这些问题而生的框架 下面看下它的框架结构
pomelo框架提供了一套灵活,快捷的服务器类型系统。 通过pomleo框架,开发者可以自由地定义自己的服务类型,分配管理进程资源。 在pomelo框架中,根据服务器的职责的不同,服务器主要分为fronted 和 backend两类型,二者关系如下图所示:
FRONTED
前端服务器负责承载客户端的连接,,与客户端之间的所有请求和响应都会经过fronted. 同时也负责维护客户端session,并把请求路由给backend server
BACKEND
后端服务器负责接收fronted 发过来的请求,实现具体的游戏逻辑,并把消息回推给fronted server,再最终发送给客户端
pomelo中有四种消息类型:request, response, notify , push 客户端可以向服务器发送两种类型的消息:request, notify request/response是一组,服务器端接收到请求,处理完逻辑后会做出响应 notify是单向的,客户端通知服务器端的消息, 服务器端无需返回响应 push 是服务器主动推送消息给客户端,客户端注册监听事件,处理具体的事件逻辑 比如:公告,邮件等
整个请求响应过程如下图:
请求流程处理
FILTER过滤器
module.exports = function(){
return new Filter();
}
var Filter = function(opt){
}
var filter = Filter.prototype;
//before
filter.before = function(msg, session, next){
next();
//进入到下一个before filter
}
//after
filter.after = function(err, msg, session, resp, next){
//todo
next();
}
HANDLER
module.exports = function(){
return bearcat.getBean(Handler);
}
var Handler = function(){
this.$id = 'Handler';
}
handler.methodName = function(msg, session, next){
}
ERRORHANDLER 全局异常处理
/**
* err 前面流程发生的异常
* resp 是前面流程传递过来,要返回给客户端的响应信息
* 其他参数与前面的handler一样
*/
errorHandler = function(err, msg, resp , session, next){
//todo
}
app.set('errorHandler',errorHandler);
session可以看成一个简单的key/value的对象,主要是维护当前玩家状态信息,比如:当前玩具的id, fronted服务器等 session对象由客户端所连接的frontend服务器维护。 在分发请求给backend服务器时,frontend服务器会克隆session, 连同请求一起发送给backend服务器。 在backend服务器上,session应该是只读的,或者起码只是本地读写的一个对象。 任何直接在session上的修改,只对本服务器进程生效,并不会影响玩家的全局状态信息。 如需修改全局session里的状态信息,需要调用frontend服务器提供的RPC服务。
//connector/entryHandler.entry
session.bind(uid);
session.set(key,value);
session.pushAll();//同步session给后端服务器
前端和后端session 都可以通过session.set session.pushAll() 互相同步session信息
应用场景:推送广播消息 Channel是服务器向客户端推送消息的通道。 Channel可以看成是一个玩家ID的容器。 比如一个公会的成员,就是一个容器,公会内部聊天,只推送给公会的成员 Channel只适用于服务器进程本地,及在服务器进程A创建的channel和在服务器进程B创建的channel是不同的,互相独立的
channel分两类: 具有channel_name和匿名channel, 区别在于匿名channel推送消息需制定uids。 推送消息过程:
//源码
/**
* Setup enviroment.
*/
var setupEnv = function(app, args) {
// 'env' , 创建app opt参数 || NODE_ENV || 'development'
app.set(Constants.RESERVED.ENV, args.env || process.env.NODE_ENV || Constants.RESERVED.ENV_DEV, true);
};
var app = pomelo.createApp({
env: process.env.NODE_ENV
});
>$ pomelo start -e production
Pomelo游戏开发~不再更新
转自http://nextzeus.github.io/pomelo/