技术文章 > 服务端 > pomelo 用户指南-应用程序配置 

应用程序配置

在这部分,我们来介绍如何配置框架。
我们知道在 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(, , function() {
 
});

app.configure(....);
app.set(...);
app.route(...);

// ...

// start app
app.start();
首先会创建一个 app 实例,然后是一些通过 app 这个上下文对框架的一些配置以及一些初始化操作,最后启动应用。这里我们将主要关注对框架的配置部分。

使用 app.configure 调用来配置


服务器的配置主要由 configure() 方法完成,完整的 app.configure 配置参数如下:
app.configure([env], [serverType], [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(, );

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 两种配置模式,以对应具体的是开发调试环境还是具体的产品环境,其配置字段如下:

总结

在这部分,介绍了在 app.js 如何配置整个框架并在最后给出了服务器配置文件的格式。通过 application 的 configure 等调用,可以给不同的服务器完成不同的配置,比如,配置 router,配置 filter,为特定类型的服务器加载自定义的 component 等等。同样,在这里,也可以做一些初始化的加载操作,比如,当应用需要数据库时,可以加载 mysql 的配置文件,并将配置信息设置到 app 上下文中,这样在应用中,就可以通过 app 直接获取到对应的配置信息。


来源:摘自 https://github.com/NetEase/pomelo/wiki/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E9%85%8D%E7%BD%AE,本站 行痴 整理