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

Pomelo 组件

xy edited this page Nov 11, 2013 · 3 revisions

#Pomelo组件

组件(component)是纳入服务器生命周期管理的服务单元。Pomelo服务器启动的过程实际上就是加载和启动一些列组件的过程(更多关于组件的细节请参考这里)。Pomelo框架内部提供了一系列的组件,并默认在启动过程中加载并启动它们,以提供Pomelo中所需的各项服务。本文档将介绍这些内置组件的作用,以及开发者如何对这些组件进行配置。但对于一些不稳定的特性和配置选项暂时先隐藏。

Pomelo内置组件的代码放置在lib/components/目录下。它们当中大部分充当一个包装器角色,将Pomelo框架内部的服务包装后,使之纳入容器的生命周期管理并暴露给外界使用。

##Pomelo组件配置

开发者可以在app.js文件中对各个内置组件进行配置。配置的方式是在app中设置名为 componentNameConfig的属性,该属性的value将被作为初始化参数传递给组件。其中 componentName 为对应组件的名字。例如,配置connector组件的属性的例子如下:

app.set('connectorConfig', {
  connector: pomelo.connectors.hybridconnector,
  heartbeat: 3,
  useDict: true,
  useProtobuf: true
});

注意 :具体的配置参数由对应的组件决定,可能会随组件的升级发生改变。

##组件说明

###channel

提供channel相关的服务的组件。加载该组件后,会在app上下文加入channelService,可以通过app.get('channelService')获取。channelService相关的接口信息请参考Pomelo API

####配置

  • broadcastFilter - broadcast的过滤函数。会在执行broadcast操作时,在每个frontend server上,在将消息发送给每个session之前触发。返回true表示可以将消息发送给该session;false则消息将不会发送给对应的session。

#####参数 * session - 消息将发往的session。 * msg - 待发消息。 * param - broadcast附带参数,在channelService.broadcast(type, route, {filterParam: param}, cb)中传递。

####使用例子

app.set('channelConfig', {
  broadcastFilter: function(session, msg, param) {
	// check some condition
	return true;
  }
});

###connection

无配置项。提供统计frontend server连接数服务的组件,组件名__connection__,在frontend server上会被加载,主要工作是将connectionService封装成组件。pomelo-admin依赖这个组件进行frontend server的连接数和登录用户数进行统计。

###connector

管理frontend server底层的连接和通信协议的实现,组件名__connector__。配置参数由所使用的connector实现决定。

####配置

  • connector - connector工厂方法,创建并返回新的connector实例。

#####参数 * port - 监听端口 * host - 监听的host名 * opts - 额外初始化参数

目前Pomelo提供两个connector的实现:sioconnectorhybridconnector。关于这两个connector的更多信息请参考Pomelo 0.3新特性

###dictionary

生成route字符串压缩编码的组件。该组件会遍历所有handler的route字符串,并为之生成唯一的压缩编码。同时也支持用户配置额外的route字符串,默认配置文件为config/dictionary.json,也可以通过配置来指定该文件的位置。

注意 dictionary组件只有在Pomelo 0.3版本中使用hybridconnector并且配置useDict为true时才有效。

####配置

指定用户自定义route字符串配置文件

app.set('dictionaryConfig', {
  dict: path.join(app.getBase(), '/config/dictionary.json')
});

###backendSession

无配置项。提供BackendSession相关服务的组件。加载该组件后,会在app上下文中加入backendSessionService,可以通过app.get('backendSessionService')获取。backendSessionService相关的接口信息请参考Pomelo API

###master

无配置项。在master进程上加载。提供master相关功能,如:根据配置启动各个服务器进程,运行pomelo-adminmaster端并加载master端modules,监控各个进程状态信息等。

###monitor

无配置项。在master之外的各个进程上加载。运行pomelo-adminmonitor端并加载monitor端modules。

###protobuf

无配置项。该组件负责加载protobuf数据定义文件和提供protobuf相关encode和decode服务(内部使用)。

注意 protobuf组件只有在Pomelo 0.3版本中使用hybridconnector并且配置useProtobuf为true时才有效。

具体pomelo-protobuf的使用,请参考这里

###proxy

提供rpc客户端代理生成和rpc客户端请求路由计算服务。该模块加载后,会在app上下文加入rpc字段。app.rpc是rpc代理对象的根节点,根据各个服务器路径下remote/目录下的服务代码自动生成,可以通过app.rpc.serverType.service.method的形式发起远程调用。

可以通过app.route方法对特定类型的服务器类型配置路由计算函数。路由计算函数的主要工作就是决定某一个消息应该发往哪一个远程服务器。

####使用例子

为area服务器配置路由函数routeFn。

app.route('area', routeFn);

配置默认的路由函数,所有发往没配置路由函数的服务器类型的请求都会交给默认路由函数计算。

app.route('default', defaultRouteFn);

路由函数的定义:

var routeFn = function(session, msg, app, cb) {
  // 实现路由策略,计算得到目标服务器id
  cb(null, serverId);
};

###remote

提供远程服务暴露服务。根据当前服务器类型,加载对应remote/目录下的服务器代码,并根据配置的端口将远程服务暴露出来。该模块启动后,其他服务器即可连接配置的端口,向当前服务器发起rpc调用。

更多关于pomelo-rpc的使用细节,请参考这里

###server

server模块使服务器具备处理客户端请求的能力。该模块主要实现了filter服务,根据当前服务器类型,加载对应handler/目录下的代码,并决定一个请求应该是在当前服务器处理还是应该路由给其他服务器处理。

###session

无配置项。提供globalSession相关服务的组件。加载该组件后,会在app上下文中加入sessionService,可以通过app.get('sessionService')获取。sessionService相关的接口信息请参考Pomelo API

###sync

提供定时同步内存数据到数据库的服务。该组件加载后会在app向下文中加上sync属性,可以通过app.get('sync')来获取。

####配置

配置sync组件

app.load(pomelo.sync, {path:__dirname + '/app/dao/mapping', dbclient: dbclient});

其中,path是实现底层数据同步服务器的目录。sync会加载该目录下所有服务,并建立映射关系。dbclient是用来实现数据同步服务的回调参数。

数据同步服务示例

module.exports = {
  updateBag: function (dbclient, val, cb) {
    var sql = 'update Bag set items = ? where id = ?';
    var items = val.items;
    if (typeof items !== 'string') {
      items = JSON.stringify(items);
    }
    var args = [items, val.id];

    dbclient.query(sql, args, function (err, res) {
      if (err) {
        console.error('write mysql failed! ' + sql + ' ' + JSON.stringify(val));
      }
      cb(!!err);
    });
  }
};

通过sync更新数据

app.get('sync').exec('bagSync.updateBag', player.bag.id, player.bag);

更多关于pomelo-sync的使用细节,请参考这里

Clone this wiki locally