应用程序配置
在这部分,我们来介绍如何配置框架。我们知道在pomelo中,可以配置各个组件的选项,加载配置文件,开启pomelo的特性等等。这一切配置都是在game-server/app.js中进行的。实际上,在pomelo的应用中有两个app.js,一个在game-server目录下,一个在web-server目录下。其中game-server下的app.js是整个游戏服务器的入口和配置点,而web-server下的app.js则是web服务器入口。在这里,我们仅仅介绍如何在game-server/app.js中配置框架以及pomelo框架使用的服务器配置文件的格式。
app.js文件
app.js是运行pomelo项目的入口,在app.js中,首先会创建一个app的实例,这个app作为整个框架的配置上下文来使用,用户可以通过这个上下文,设置一些全局变量,加载配置信息等等操作。app.js中的一般代码如下:
var pomelo = require('pomelo');
var app = pomelo.createApp();
// some configuration
app.configure(<env>, <serverType>, function() {
});
app.configure(....);
app.set(...);
app.route(...);
// ...
// start app
app.start();
首先会创建一个app实例,然后是一些通过app这个上下文对框架的一些配置以及一些初始化操作,最后启动应用。这里我们将主要关注对框架的配置部分。
使用app.configure调用来配置
服务器的配置主要由configure()方法完成,完整的app.configure配置参数如下:
app.configure([env], [serverType], [function]);
前两个参数是可选的, 以下是参数说明:
- env: 运行环境, 可设成development, production或development|production
- serverType: 服务器类型,设置了这个参数只会对当前参数类型服务器做初始化,不设置则对所有服务器执行初始化function
- function: 具体的初始化操作, 内部可以写任何对框架的配置操作逻辑。
以下是一些配置实例:
实例一
app.configure(function(){
// do some configuration
});
这种配置将对所有模式(development/production)下的所有服务器生效,它等价于在app.js中,不调用configure,直接执行相关的配置,代码示例如下:
app.configure(function() {
doSomeConfiguration();
});
// <==>
doSomeConfiguration(); // equivalent to above `app.configure`
实例二
app.configure('development', function(){
// do some configuration just for development env only.
});
这种配置则只针对development模式下所有服务器生效,同样在这里可以填入任何配置。
实例三
app.configure('development', 'chat', function(){
// do some configuration just for development env and chat server only.
});
这种配置则针对development模式下的chat服务器生效,这里同样可以填入任何配置。
配置内容
在configure中用户可以根据应用的不同需求在不同的服务器中进行相关配置,例如在全局设置mysql参数:
app.configure('development|production', function(){
app.loadConfig('mysql', app.getBase() + '/config/mysql.json');
});
另外也可以选择在具体的服务器中进行应用的配置,例如可以做一些初始化操作:
var initArea = function(){
//area init
};
app.configure('development|production', 'area', function(){
initArea();
});
而更多地,可以在configure中,针对不同的服务器,不同的环境,对框架进行不同的配置。这些配置包括设置一个上下文变量供应用使用,开启一些功能选项,配置加载一个自定义的component,针对不同的服务器,配置filter等等配置操作,如下所示:
app.configure('development|production', 'chat', function() {
app.route('chat', routeUtil.chat);
});
app.enable('systemMonitor');
app.configure('development|production','gate', function() {
app.set('connectorConfig', {
connector: pomelo.connectors.hybridconnector,
heartbeat: 3
});
}); // configure connector for gate server
下面就对这些框架配置作些介绍。
上下文变量存取
上下文对象app提供了设置和获取应用变量的方法,其签名为:
app.set(name, value, [isAttach]);
app.get(name);
- 如上,对于set来说,有三个参数,分别是变量名,变量的值以及一个可选的参数isAttach。如果isAttach设置为true的话,那么表示将变量attach到app对象上,作为app的一个属性,以后对此变量的访问,可以直接通过app.name进行访问,这个参数默认为false。
- 对于get调用,就是一个很简单的通过变量名获取变量值。
示例代码如下:
app.set('server',server);
var server = app.get('server');
app.set('service', service, true);
var service = app.service;
在pomelo中框架中,可以通过app.set给pomelo的组件配置相应的选项,也可以通过app.get获得到pomelo框架加载的服务,如backendSessionService,channelService等等,示例代码如下:
app.set('connectorConfig', {
// ...
}); // set opts for connector component
var backendSessionService = app.get('backendSessionService'); // get backendSessionService instance
如果用户需要自己设置一些自己的自定义变量,也可以通过app这个上下文实现获取和设置。
开启和关闭功能选项
应用的功能选项配置可以通过enable和disable来打开和关闭。另外,用户可以通过enabled和disabled对相应的状态进行判断,如果该状态存在则返回true,反之返回false。例如要打开或者关闭应用的rpc debug log并查看其状态是否存在, 示例代码如下:
app.enable('rpcDebugLog');
app.enabled('rpcDebugLog'); // return true
app.disable('rpcDebugLog');
app.disabled('rpcDebugLog'); //return true
在pomelo框架中,当需要做更详细的监控管理的时候,可以打开systemMonitor选项,打开systemMonitor选项会使得默认加载额外的admin-module,示例代码如下:
app.enable('systemMonitor'); // enable system monitor
同样,用户可以设置自己应用的一些功能选项,并通过enable,disable,enabled,disabled来进行开启关闭以及检查。
加载配置文件
用户可以通过loadConfig加载配置文件,加载后文件中的参数将直接挂载到app对象上。例如需要加载mysql.json文件,示例代码如下:
{
"development":
{
"host":"127.0.0.1",
"port":"3306",
"database":"pomelo"
}
}
然后,加载完成后,就可以直接通过app对象,访问具体的配置参数,示例代码如下:
app.loadConfig('mysql', path.resolve('./config/mysql.json'));
var host = app.get('mysql').host; //返回 127.0.0.1
当然,用户可以使用loadConfig的调用加载任何json格式的配置文件,用于其他的目的,并能通过app进行访问。需要注意的是所有的json配置文件中都要指定具体的模式,也就是development或者production。
加载component
pomelo的功能由其component提供,pomelo会默认根据服务器的类型加载不同的内建组件,另外用户可以根据应用需求自定义组件。组件的加载主要是使用load方法,示例代码如下:
app.load(HelloWorldComponent, [opts]); //opts is optional
加载plugin
pomelo还可以加载自定义的插件,一个插件由多个component和一组对应用的事件进行响应的事件处理组成,加载插件使用app.use, 示例代码如下:
// app.use(<plugin>, <plugin options>);
var statusPlugin = require('pomelo-status-plugin');
app.use(statusPlugin, {
status:{
host: '127.0.0.1',
port: 6379
}
});
配置router
router主要负责请求路由信息的维护,路由计算,路由结果缓存等工作,并能根据需要切换路由策略,更新路由信息等。用户可以自定义不同服务器的不同路由规则,然后进行配置即可。以下示例为chat服务器配置路由规则:
//routeUtil.js
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处理从而完成服务器选择。用户可以根据自己的实际需求进行配置相应的router。
配置filter
当一个客户端请求到达服务器后,经过filter链和handler处理,最后生成响应返回给客户端。handler是业务逻辑实现的地方,filter则是执行业务前进行预处理和业务处理后清理的地方。为了开发者方便,系统内建提供了一些filter,例如:serialFilter,timeFilter,timeOutFilter,另外用户可以根据应用的需要自定义filter。配置filter的调用示例如下:
app.filter(pomelo.filters.serial()); // use builtin filter: serial filter
app.filter(FooFilter); // use FooFilter as a before & after filter
app.before(beforeFilter); // use beforeFilter as a before filter
app.after(afterFilter); // use afterFilter as an after filter
用户可以自定义自己的filter,然后通过app.filter调用,将其配置进框架。如果仅仅是before filter,那么就调用app.before,如果是after filter,就掉用app.after,如果既定义了before filter又定义了after filter,那么就可以使用app.filter调用了。
配置admin-module
pomelo 提供了监控管理框架,可以给其配置不同的admin module,具体的配置使用调用app.registerAdmin,示例代码如下:
app.registerAdmin(require('../modules/watchdog'), {app: app, master: true});
用户也可以自定义自己的module,然后通过registerAdmin调用,加载到框架。
服务器配置文件格式
pomelo的配置文件都在game-server/config目录下,其中有两个很重要的服务器配置文件servers.json和master.json。 所有的配置文件中,都分为development和production两种配置模式,以对应具体的是开发调试环境还是具体的产品环境,其配置字段如下:
master.json中:
- id: master 服务器的服务器id,是一个字符串;
- host: master 服务器的host,可以是一个ip或域名;
- port: master服务器开的端口,默认是3005;
- args: 可选的,在这里配置的参数选项,是用来给node/v8使用的,如你可以配置
"args": "--debug=5858"
,这样的话,就可以开启调试。
servers.json中:
- id: 应用服务器的服务器id,是一个字符串;
- host: 应用服务器的host,可以是一个ip或域名;
- port: 接受rpc请求时使用的端口号,对于后端服务器来说必须的,对于前端服务器来说,如果仅仅像gate服务器那样,并不维护具体的客户端连接,仅仅给客户端返回可以连接的前端服务器的地址信息的话,port则是可以省略的。一般来说,port不应该省略;
- frontend: 是一个boolean值,对于前端服务器,配置为true,如果省略的话,则默认为false。后端服务器不配置;
- clientPort: 这是前端服务器接受客户端连接启用的端口,对于后端服务器来说,不需要配置,对于前端服务器,则是必需的。
- max-connections: 可选的,用来说明前端服务器最多承受的连接数,如果超过了这个连接数,则后来的连接将会会connector拒绝;
- args: 可选的,同master中的语义一样。
总结
在这部分,介绍了在app.js如何配置整个框架并在最后给出了服务器配置文件的格式。通过application的configure等调用,可以给不同的服务器完成不同的配置,比如,配置router,配置filter,为特定类型的服务器加载自定义的component等等。同样,在这里,也可以做一些初始化的加载操作,比如,当应用需要数据库时,可以加载mysql的配置文件,并将配置信息设置到app上下文中,这样在应用中,就可以通过app直接获取到对应的配置信息。