-
Notifications
You must be signed in to change notification settings - Fork 2.9k
游戏服务器的app.js配置参考
在pomelo中有两个app.js,它们分别在game-server目录和web-server目录下,分别对应游戏服务器与web服务器,并且它们都是各自服务器的入口。以下内容主要是针对game-server中的app.js的配置说明。
app.js是pomelo项目的入口,在使用pomelo命令行创建一个新项目时,会根据项目的相关信息生成默认的app.js文件。其主要内容如下:
var pomelo = require('pomelo');
var app = pomelo.createApp();
app.set('name', 'nameofproject');
app.set('dirname', __dirname);
app.defaultConfiguration();
app.start();
首先根据pomelo创建一个应用;然后对该应用进行基本的配置,包括设置应用名称、设置应用所在目录、接着会进行pomelo的默认配置,这些配置都是创建一个项目必要条件;最后配置完成后就可以启动项目。
应用的变量可以通过set和get方法进行存取,例如要存取server对象,具体代码如下:
app.set('server',server);
var server = app.get('server');
应用的状态信息可以通过enable和disable来激活和关闭,例如要激活或者关闭应用的schedulerService状态,同时,用户可以通过enabled和disabled对相应的状态进行判断,如果该状态存在则返回true,反之返回false。具体代码如下:
app.enable('filter');
app.enabled('filter'); //返回true
app.disable('filter');
app.disabled('filter'); //返回true
用户可以通过loadConfig和loadService加载配置文件和服务,加载后文件中的参数将直接挂载到application对象上。例如需要加载mysql.json文件,具体代码如下:
{
"development":
{
"host":"127.0.0.1",
"port":"3306",
"database":"pomelo"
}
}
app.loadConfig('mysql.json');
var host = app.mysql.host; //返回 127.0.0.1
app.loadService('scheduleService');
服务器的配置主要由configure()方法完成,完整的app.configure配置参数如下:
app.configure([env], [serverType], [function]);
前两个参数是可选的, 以下是参数说明:
- env: 运行环境, 可设成development, production或development|production
- serverType: 服务器类型,设置了这个参数只会对当前类型服务器做初始化,不设置则对所有服务器执行初始化function
- function: 具体的初始化操作, 内部可以写任何js方法
以下是一些配置实例:
app.configure(function(){
});
这种配置将对所有的模式(development/production)下的所有服务器生效。
app.configure('development', function(){
});
这种配置则只针对固定某个模式下所有服务器生效。
app.configure('development', 'chat', function(){
});
这种配置则针对development模式下的chat服务器生效。
在configure中开发者可以根据应用的不同需求在不同的服务器中进行相关配置,例如在全局配置mysql的启动文件:
app.configure('development|production', function(){
app.set('mysql', app.get('dirname')+'/config/mysql.json');
});
另外也可以选择在具体的服务器中进行应用的配置,例如:
var initArea = function(){
//area init
};
app.configure('development|production', 'area', function(){
initArea();
});
component是pomelo的组件,它是具有生命周期的应用组件,通常在系统初始化时载入。 系统自带的component如下:master、monitor、logger、proxy、handler、remote、server、sync和connection,其主要功能如下:
- master: master组件主要负责启动master服务器。
- monitor: monitor组件主要负责监控各个服务器,同时所有服务器节点会定期向master服务器发送心跳包和当期服务器的基本信息主要包括cpu和内存使用情况。
- logger: logger组件主要负责启动服务器中日志记录服务。
- proxy: proxy组件主要负责生成服务器rpc客户端,由于系统中存在多个服务器进程,不同服务器进程之间相互通信需要通过rpc调用(master服务器除外)。
- handler:handler组件主要负责加载前端服务器中的handler目录下的文件。
- remote: remote组件主要负责加载后端服务器的服务并生成服务器rpc服务端。
- server:server组件主要负责启动前端服务器。
- sync: sync组件主要负责启动数据同步模块并对外提供数据同步功能。
- connection: connection组件主要负责启动用户连接信息的统计服务。
系统会默认加载大多数组件。组件的加载主要是使用load方法,例如:
app.load(pomelo.proxy, [options]); //options参数可选
用户可根据应用需求自定义组件,自定义组件的开始可参考自定义组件开发参考
router主要负责路由信息的维护,路由计算,路由结果缓存等工作,并能根据需要切换路由策略,更新路由信息等。用户可以自定义不同服务器的不同路由规则,然后在app.js中进行配置即可。例如为chat服务器配置路由规则:
app.route('chat', routeUtil.chat);
在routerUtil中可以具体的定义不同服务器的路由规则,例如:
routeUtil.chat = function(session, msg, app, callback) {
var chatServers = app.getServersByType('chat');
if (!chatServers) {
callback(new Error('can not find chat servers.'));
return;
}
var server = dispatcher.dispatch(session.rid, chatServers);
callback(null, server.id);
};
在回调函数中返回服务器的id即可,这里使用dispatcher对session.rid进行hash处理进行服务器选择。
当一个客户端请求到达服务器后,经过filter链和handler处理,最后生成响应返回给客户端。handler是业务逻辑实现的地方,filter则是准备工作和清理工作实现的地方,方便代码模块化和复用。pomelo本身提供了一些filter,另外用户可以根据应用的需要自定义filter。filter的配置如下:
- serial: 主要负责保证所有从客户端到服务端的请求能够按顺序地发送。
app.filter(pomelo.filters.serial());
- time: 主要负责统计请求的相应时间。
app.filter(pomelo.filters.time());
- timeOut: 主要负责监控请求响应时间,如果超时就给出警告。
app.filter(pomelo.filters.timeout());
var pomelo = require('pomelo');
var routeUtil = require('./app/util/routeUtil');
/**
* Init app for client.
*/
var app = pomelo.createApp();
app.set('name', 'chatofpomelo');
app.set('dirname', __dirname);
app.defaultConfiguration();
// app configure
app.configure('production|development', function() {
// route configures
app.route('chat', routeUtil.chat);
app.route('connector', routeUtil.connector);
// remote configures
app.set('remoteConfig', {
cacheMsg: true,
interval: 30
});
// filter configures
app.filter(pomelo.filters.timeout());
// mysql configures
app.loadConfig('mysql', app.get('dirname') + '/config/mysql.json');
});
// start app
app.start();