Skip to content
This repository has been archived by the owner on Sep 25, 2023. It is now read-only.

应用程序配置

William Hsueh edited this page Jan 27, 2015 · 7 revisions

在这部分,我们来介绍如何配置框架。我们知道在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直接获取到对应的配置信息。

Clone this wiki locally