pomelo 0.6 版本火热发布啦

pomelo 0.6 版本新特性

在Pomelo 0.6版本中,对pomelo部分结构进行了调整,将原有的globalChannel组件和master高可用组件从框架中移出,以一种插件的形式提供给用户,具体可以参考pomelo-globalchannel-plugin, pomelo-masterha-plugin;同时在新版本中提供了一个交互式命令行工具,相比之前的命令行工具,使用更为方便、安全,对于项目的运维会更加方便;另外为了进一步提高pomelo的安全性,在0.6版本中引入了数据的签名验证,同时对hybridconnector的非法连接进行了相关处理;其它新的特性还包括详细的rpc debug日志和前端服务器的基本过载保护功能。

交互式命令行

为了方便开发者更好的对使用pomelo开发的服务进行运维,在新版本中提供了交互式命令行工具,具体情况可以参考pomelo-cli

服务器连接认证

服务器与master之间的连接需要进行认证以提高服务的安全性,目前在pomelo-admin中提供了一个简单的服务器认证,可以看 admin auth

使用连接认证,需要在 config 目录下添加 adminServer.json 的文件

[{
    "type": "connector",
    "token": "agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn"
}, {
    "type": "chat",
    "token": "agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn"
},{
    "type": "gate",
    "token": "agarxhqb98rpajloaxn34ga8xrunpagkjwlaw3ruxnpaagl29w4rxn"
}
]

type 是serverType, token 是一个字符串,你可以自己生成

你可以通过自己定义的认证还是来完成认证的工作

具体情况可以参考 admin auth server

plugin机制

为了方便开发者根据自身的需求对pomelo原有的功能进行有效的扩展,在新版本中提供了插件机制的功能,同时将之前版本中的globalChannel和master服务器高可用部分以plugin的形式提供,具体情况可以参考 pomelo plugin。如果要将pomelo升级到0.6,对于之前的pomelo-sync库需要重新修改在app.js中的配置,参考配置修改如下:

var sync = require('pomelo-sync-plugin');
app.use(sync, {sync: {
 // opts parameters passed to constructor
}});

连接加密

在pomelo 0.6版本中,对hybridconnector增加了数据签名的功能。客户端首先产生rsa的密钥对,客户端保留rsa私钥,在握手阶段客户端将公钥发到服务端;在发送消息阶段,客户端使用私钥对消息进行签名,客户端将消息和签名一起发送到服务端,服务端进行签名验证,如果验证成功后面的流程继续,如果验证失败则该数据包则不进行处理。具体流程可以参考下图:

rsa

使用方法

在客户端连接的过程中增加encrypt:true,在服务端app.js中配置useCrypt,具体代码参考:

客户端

pomelo.init({
 host:'127.0.0.1',
 port:3014,
 encrypt:true
}, function() {
// do something connected
});

服务端

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

非法连接处理

在pomelo中sioconnector是基于socket.io,socket.io本身是有对非socket.io的连接进行处理的。对于hybridconnector,底层是基于socket的,在pomelo 0.6版本中增加了对不符合规定协议的连接进行拒绝处理。主要包括两个部分:1.对空连接进行了超时处理;2.对不符合协议规范的连接进行拒绝处理。

rpc debug日志

根据网友的建议,在pomelo 0.6版本中增加了更多的rpc日志。开发者只需要在app.js中使用app.enable('rpcDebugLog')即可,另外需要在game-server/config/servers.json中配置category为rpc-debug的appender,具体配置可以参考如下代码:

{
 "type": "file",
 "filename": "./logs/rpc-debug-${opts:serverId}.log",
 "maxLogSize": 1048576,
 "layout": {
  "type": "basic"
 },
 "backups":5,
 "category": "rpc-debug"
}

过载保护

在pomelo之前的版本中有toobusy模块对服务器进行过载保护,在新版本中增加了一个对connector连接数的限制功能,开发者只需要在servers.json中对不同的connector进行最大连接数量的配置,当connector超过配置的最大数量,服务器会拒绝连接。配置可以参考如下代码:

{"id":"connector-server-1", "host":"127.0.0.1", "port":4050, "clientPort":3050, "frontend":true, "max-connections": 100}

服务器断网重连机制

在之前pomelo的版本中,在分布式环境下,存在服务器(非master)网络短时间断开,然后网络恢复后服务无法恢复的情况。在pomelo 0.6版本中,如果服务器(非master)短时间断开,网络恢复后服务器可以正常工作。

Daemon启动模式

pomelo-daemon提供对pomelo服务进行分布式环境下的启动以及rpc debug日志的收集

详细情况请看 pomelo-daemon

升级的logger

在新版中对pomelo中的logger进行了升级

- logger支持自定义prefix输出,把prefix打印在消息的头部,prefix可以是文件名,serverId, host 等等
- logger在debug模式下支持log行号的打印,方便开发者分析调试

- 在pomelo中的日志统一输出到了category为pomelo的appenders

详细情况请看 pomelo-logger

pomelo-protobuf支持rootMsg的proto文件定义

通过定义rootMsg,可以很好的进行复用,简化protos文件的大小

{
  "message Path": {
    "required double x" : 1,
    "required double y" : 2
  },
  "message Equipment" : {
    "required uInt32 entityId" : 1,
    "required uInt32 kindId" : 2
  },
  "onMove" : {
    "required uInt32 entityId" : 1,
    "repeated Path path" : 2,
    "required float speed" : 3
  },
  "area.playerHandler.enterScene" : {
    "message Player" : {
      "message Bag" : {
        "message Item" : {
          "required uInt32 id" : 1,
          "optional string type" : 2
        },
        "repeated Item items" : 1
      },
      "required uInt32 entityId" : 1,
      "required uInt32 kindId" : 2,
      "required Bag bag" : 3,
      "repeated Equipment equipments" : 4
    },
    "optional Player curPlayer" : 2
  }
}

以上定义的Equipment和Path都是可能复用的root message。
详细情况情况 pomelo-protobuf

标签:无
fantasyni 在 2013-8-26 15:02发布
fantasyni 在 2013-8-29 15:31重新编辑 分享到 weibo
10 回复
#1 py8765 2013-8-26 15:10 回复

顶!

#2 zlstt 2013-8-26 15:24 回复

V5惨了

#3 wangdy 2013-8-26 15:37 回复

这次升级很给力!!

#4 {8} ontheway 2013-8-26 15:44 回复

服务端如果用pushmesage的方式推送消息,使用protobuf后多一层目录,不知这个是否正常了现在?

fantasyni 2013-8-26 16:17 回复

@ontheway 没明白,正常?

fantasyni 2013-8-26 16:30 回复

@ontheway 一个月前的,还没解决?

ontheway 2013-8-27 10:18 回复

@fantasyni 我刚升级到了6.0,这个问题还是没有解决,麻烦测试下

fantasyni 2013-8-27 10:36 回复

@ontheway 你消息格式有问题吧,和proto定义的不一致

ontheway 2013-8-27 10:59 回复

@fantasyni 我是这样设置的,

这是调用时的代码:

app.rpc.chat.chatRemote.pushByUserId( null, uid, { route : 'onBattle', msg : { win : 1 } } ), cb );

这是方法的定义:
CharService.prototype.pushByUserId = function( uid, msg, cb ) {
var record = this.uidMap[ uid ];
if( !record ) {
cb( null, Code.CHAT.FA_USER_NOT_ONLINE );
returnl
}
this.app.get( 'channelService' ).pushMessageByUids( msg, [ { uid : record.uid, sid : record.sid} ], cb );
}

这是proto:

{
    "onBattle" : {
        "required uInt32 win" : 1
    }
}
ontheway 2013-8-27 12:04 回复

@fantasyni 我把封装CharService.prototype.pushByUserId这个地方修改了下就ok了,

this.app.get( 'channelService' ).pushMessageByUids( msg.route, msg.msg, [ { uid : record.uid, sid : record.sid} ], cb );

用这个就会报错

this.app.get( 'channelService' ).pushMessageByUids( msg, [ { uid : record.uid, sid : record.sid} ], cb );
fantasyni 2013-8-27 13:49 回复

@ontheway 这个你得好好看看api了,不能乱用哦,或者看看代码

#5 {6} xiecc 2013-8-26 15:45 回复

顶, 这次升级很多cool特性

jiangzhuo 2013-8-26 21:30 回复

相應功能的libpomelo客戶端也要速度出啊

fantasyni 2013-8-27 08:48 回复

@jiangzhuo libpomelo 已经升级了哈

jiangzhuo 2013-8-27 12:25 回复

@fantasyni rsa連接加密相關的功能libpomelo有了嗎?

fantasyni 2013-8-27 12:55 回复

@jiangzhuo 哦,rsa加密还没有,不过 rootMsg 的 protos 支持已经有了

jiangzhuo 2013-9-5 12:37 回复

@fantasyni 亲,把rsa加密快写了呗,来北京请你吃饭哦亲,您写了我就省得写了啦。

xiecc 2013-9-5 13:50 回复

@jiangzhuo 呵呵,你怎么知道他去北京了?

#6 {1} MJiao 2013-8-30 23:22 回复

要是pomelo-cli 支持自定义命令参数就更好了

fantasyni 2013-8-31 12:09 回复

@MJiao 这个如果你有更有用的功能,可以编写一个command文件,在commands文件夹下面,pull request上来哈

#7 nichole 2013-9-2 14:48 回复

windows用npm升级 更新不到0.6版本
麻烦帮忙解决一下

#8 {5} roytan 2013-9-2 16:58 回复

如果升级再平滑点就好了。每次大版本升级,总会报有些函数找不到了。

fantasyni 2013-9-2 17:01 回复

@roytan 哪个函数找不到了啊?

roytan 2013-9-2 18:29 回复

@fantasyni 这两处,在0.5版本都是正常的,今天升级0.6,直接红字提示错误。。。

roytan 2013-9-3 11:18 回复

今天上午以来,又发现一个
http://nodejs.netease.com/topic/5225548ad6bc618c603a3464

唉。。。这次大版本升级,比0.4到0.5差了一些。我记得0.4到0.5没改什么运行起来都ok。现在到了0.6,各种诡异bug都来了。

#9 {1} nichole 2013-9-2 19:16 回复

windows用npm升级 更新不到0.6版本
麻烦帮忙解决一下
gyp WARN install got an error, rolling back install
gyp ERR! configure error
gyp ERR! stack Error: connect ETIMEDOUT
gyp ERR! stack at errnoException (net.js:901:11)
gyp ERR! stack at Object.afterConnect [as oncomplete] (net.js:892:19)
gyp ERR! System Windows_NT 5.1.2600
gyp ERR! command "node" "C:\\Program Files\\nodejs\\node_modules\\npm\\node_modu
les\\node-gyp\\bin\\node-gyp.js" "rebuild"
gyp ERR! cwd C:\Documents and Settings\yangwei\Application Data\npm\node_modules
\pomelo\node_modules\toobusy
gyp ERR! node -v v0.10.16
gyp ERR! node-gyp -v v0.10.9
gyp ERR! not ok
npm ERR! error rolling back Error: EPERM, unlink 'C:\Documents and Settings\yang
wei\Application Data\npm\node_modules\pomelo\node_modules\pomelo-loader'
npm ERR! error rolling back pomelo@0.4.3 { [Error: EPERM, unlink 'C:\Documents
and Settings\yangwei\Application Data\npm\node_modules\pomelo\node_modules\pomel
o-loader']
npm ERR! error rolling back errno: 50,
npm ERR! error rolling back code: 'EPERM',
npm ERR! error rolling back path: 'C:\\Documents and Settings\\yangwei\\Applic
ation Data\\npm\\node_modules\\pomelo\\node_modules\\pomelo-loader' }
npm ERR! weird error 1
npm ERR! not ok code 0

py8765 2013-9-22 10:46 回复

这个是npm的问题,之前ms一直抽风。

#10 {1} TopWinStudio 2013-9-8 22:04 回复

能不能写一个pomelo 0.5升级到0.6的升级教程?原来写的程序不知道能不能不改动还能直接使用?需要注意一些什么问题?github上面对应的demo程序更新了吗?

py8765 2013-9-22 10:45 回复

0.5到0.6升级不影响之前的程序,如果需要使用新功能可以参考这个升级文档,github上的demo也都已经更新了。

回到顶部